Articles of gcc

包含文件中的更改不在C中注册

我在Arch Linux上。 我已经尝试了gcc和cc。 我有一个很奇怪的问题。 我有一个包含在/ usr / include(从Arch软件包中安装)的文件,就像C程序一样。 // prog.c #include <foobar/foobar.h> 当我改变它时,没有任何反应。 让我解释。 它包含一些C代码。 // foobar/foobar.h int baz = 1, qux = 2; 最近,它已经更新。 // foobar/foobar.h int baz = 1, qux = 2, norf = 3; 我的testing程序看起来如下所示。 // prog.c #include <foobar/foobar.h> printf ("%d %d %d\n", baz, qux, norf); 输出: error: 'norf' undeclared (first use […]

gcc连接器(ld)找不到共享库

我试图用linaro-gcc和专用的rootfs为iMX6 CPU交叉编译应用程序。 该应用程序可能被链接到OpenVG和标准的pthread库。 它编译好,但链接器未能链接到OpenVG库,所以我添加了链接器开关-L / home / ae / Documents / toradex / col-imx6 / colibri-imx6-sdk / usr / lib ,现在链接到OpenVG图书馆。 但是从那以后,即使使用链接器swtich -L / home / ae / Documents / toradex / col-imx6 / colibri-imx6-sdk / lib ,它也不能链接到pthread库。 错误消息是: ../arm-linux-gnueabihf/bin/ld: cannot find /lib/libpthread.so.0 ../arm-linux-gnueabihf/bin/ld: cannot find /usr/lib/libpthread_nonshared.a 这些库位于/ home / ae / Documents / toradex […]

alignment要求为int32_t:gcc / linux 86 vs amd64

首先我们谈论gcc / linux(x86,amd64)和c99。 这里是代码: #include <stdint.h> void f(void *p) { uint32_t *num = p; *num = 17; } int main() { char buf[8] __attribute__ ((aligned (8))); f(&buf[3]); } 问题是UB? 从一方面英特尔CPU允许不公正的访问,另一方面我发现这个: http : //www.uclibc.org/docs/psABI-i386.pdf http://www.x86-64.org/documentation/abi.pdf并且他们都提到4字节alignment为4字节整数。 所以即使编译和工作正常,它仍然是UB? 因为gcc认为“uint32_t *”指针的值指向4字节alignment的地址,并且在“f”函数中使用例如“SSE”而毫不犹豫? gcc维护者认为这样的代码是“未定义代码”: https : //gcc.gnu.org/bugzilla/show_bug.cgi?id = 66194 原来的问题是从这里(俄语): https : //ru.stackoverflow.com/questions/268888/%D0%9E%D0%BF%D1%8F%D1%82%D1%8C-%D0%BE% D0%B1-%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8-GCC -03-英特尔i5-2500分割故障

什么,馅饼确实做?

我file /bin/ls并得到输出: / bin / ls:GNU / Linux 2.6.32的ELF 64位LSB共享对象,x86-64,版本1(SYSV),dynamic链接,解释器/lib64/ld-linux-x86-64.so.2,剥离 我发现原因是我的gentoo正在用-pie编译所有东西。 如果我把-nopie传给gcc,我会得到正确的答案: 对于GNU / Linux 2.6.32,a.out:ELF 64位LSB可执行文件,x86-64,版本1(SYSV),dynamic链接,解释器/lib64/ld-linux-x86-64.so.2,未被删除 另外,我发现在构build一个.so这也是一个可执行文件 。 它使用-pie制作一个DSO可执行文件。 在gcc的手册页中,它简要地描述了: -馅饼 在支持它的目标上生成一个位置独立的可执行文件。 所以我想知道-pie是做什么的? 它如何使我的可执行文件被识别为共享对象?

Tagged初始化是否允许对结构成员进行重新sorting?

我正在阅读“Linux设备驱动程序”第三版。 提取: scull设备驱动程序只实现最重要的设备方法。 它的file_operations结构被初始化如下: struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .ioctl = scull_ioctl, .open = scull_open, .release = scull_release, }; 该声明使用标准C标记的结构初始化语法。 这种语法是首选,因为它使得驱动程序更易于在结构的定义中进行更改,并且可以使代码更加紧凑和可读。 标记初始化允许重新sorting结构成员; 在某些情况下,通过在同一硬件caching行中放置指向经常访问的成员的指针,已经实现了实质性的性能改进 。 我可能会误读。 它们是否意味着对象的最终布局与最初的结构定义有所不同? 因此是不可移植的? 我没有看到可行的实施build议。 有人能解释我在最后一段中提出的build议吗? 他们是否会build议这个function在记忆中的最终位置会受到影响,并彼此接近? 因此更可能在相同的caching行中。

来自gcc的pgo的优化报告

我可以看到,gcc的PGO(configuration文件引导优化)与我的应用程序(约15%的执行速度)工作正常。 我正在使用'-fprofile-generate',然后是'-fprofile-use'。 但是有没有什么办法可以生成一些报告来描述什么和如何优化? 我知道英特尔编译器(icc)可以做到这一点,但如何gcc?

服务器套接字错误的IP和端口

当我写下面这样的代码时,对方报告的IP和端口是正确的: int main(){ int server = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(8080); addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(server,(struct sockaddr *)&addr,sizeof addr); listen(server,5); struct sockaddr_storage inc_adrs; socklen_t inc_len; int client = accept(server, (struct sockaddr *) &inc_adrs,&inc_len); struct sockaddr_in *inc_adr = (struct sockaddr_in *) &inc_adrs; char ip [INET_ADDRSTRLEN]; inet_ntop(AF_INET,&(inc_adr->sin_addr),ip,INET_ADDRSTRLEN); printf("Connection from %s port %d\n",ip,ntohs(inc_adr->sin_port)); return […]

我从源代码安装了GCC 5.2,我不知道如何在Ubuntu 15.04上卸载它

另外一周,我在我的Ubuntu机器上安装了GCC 5.2。 我希望能够使用完全支持的cilkfunction。 现在我想回到GCC 4.9。 我怎样才能卸载GCC 5.2? 我试图使用卸载,但据我所知这不支持。

Linux时间命令高精度

我想知道是否有任何Linux命令(如时间或/ usr /斌/时间),提供一个命令的执行时间高精度纳秒

在Eclipse CDT中不能指定多个rpath

我想在GCC C ++ Linker的杂项部分指定多个rpaths。 链接器标志: -Wl,-rpath=/home/cri/Libs1, -Wl,-rpath=/home/cri/Libs2 对于一个工作,但是当我添加第二个我得到这个错误: /usr/bin/ld: cannot find : No such file or directory collect2: ld returned 1 exit status make: *** [libmylib.so] Error 1 我可以得到一些帮助,我做错了什么?