Tag: gcc

为什么我必须明确地链接libm?

可能重复: 为什么必须在C中链接数学库? 当我编写一个使用math.h库函数的程序时,为什么我必须显式链接到libm即使它们是C标准库的一部分? 例如,当我想使用sin()函数时,我需要#include 但我还需要将-lm传递给GCC。 但对于标准库中的任何其他库,我不必这样做。 为什么不同?

安装OpenCV并使用GCC编译C程序

作为我正在开展的更大项目的一部分,我需要在C程序上使用OpenCV库。 我在Fedora 17 32位中使用yum安装了OpenCV和opencv-devel。 我指示预处理器导入opencv / cv.h和opencv / highgui.h作为必要的头文件。 正如我所提到的,gcc用于编译整个C项目。 但是,链接器似乎存在问题。 每当我尝试编译项目( gcc opencv.c -o opencv )时,我都会得到一个错误列表,类似于: /tmp/ccLJWE0c.o: In function `cvRound’: opencv.c:(.text+0x19): undefined reference to `lrint’ /tmp/ccLJWE0c.o: In function `cvDecRefData’: opencv.c:(.text+0xa5c): undefined reference to `cvFree_’ opencv.c:(.text+0xacd): undefined reference to `cvFree_’ /tmp/ccLJWE0c.o: In function `cvGetRow’: opencv.c:(.text+0xbc3): undefined reference to `cvGetRows’ /tmp/ccLJWE0c.o: In function `cvGetCol’: opencv.c:(.text+0xbee): undefined […]

C测试变量是否在只读部分

我想编写一个低级日志记录function,如下所示: DO_DBG(“some string”, val1, val2) 我想要它做的是,出于性能原因,将指针存储到字符串而不是字符串的副本。 这假定该字符串是只读文字。 为了防止人们不得不调试调试器,如果DO_DBG的第一个参数是在代码与文本等的可写部分中,那么编译器会抱怨会很好。我想知道是否存在这样做的机制。 (我正在使用gcc 4.9.1,ld 2.24)。

#pragma init和#pragma fini在linux上使用gcc编译器

我想构建一些代码,在共享库的加载时调用一些代码。 我以为我会这样做: #pragma init(my_init) static void my_init () { //do-something } int add (int a,int b) { return a+b; } 所以当我用它构建代码时 gcc -fPIC -g -c -Wall tt.c 它回来了 gcc -fPIC -g -c -Wall tt.c tt.c:2: warning: ignoring #pragma init tt.c:4: warning: ‘my_init’ defined but not used 所以它忽略了我的#pragmas。 我在实际代码中尝试了这个并且我的代码中止了,因为在pragma部分中没有调用函数,因为它被忽略了。 我如何让gcc使用这些#pragma init和fini语句?

为什么我可以在另一个函数中定义一个函数?

看到下面的代码,我在另一个函数中定义了一个函数, void test1(void) { void test2(void) { printf(“test2\n”); } printf(“test1\n”); } int main(void) { test1(); return 0; } 这个用法很奇怪,是用c89 / c99还是只用gcc的扩展名(我在ubuntu 12编译时使用了gcc 4.6.3)。 我运行此代码并输出“test2”和“test1”.test2只能在test1中调用。 更重要的是,这种用法的常见场景是什么或者这种用法用于什么?

gcc -g调试标志是否影响程序执行?

我刚刚测试了一个我正在工作的程序,当我用-g编译它时,我发现它的执行速度提高了3μs(统计上显着的变化)。 这对我来说毫无意义 – 我认为-g标志不应该影响程序执行,即使它做了它也会使它运行得更慢,而不是更快。 谁能告诉我为什么会这样? 它是否改变了程序的执行流程? 我没有使用-O进行编译,因为我需要它完全按照写入执行,但如果-g可以通过更改指令顺序以某种方式使其运行得更快我显然应该使用它。 所以我需要确切知道-g标志对程序的更改。 编辑:我运行的测试越多,t值越大(=差异变得越有统计意义)。 这绝对不是测量误差 – 事情正在发生。

使用gcov进行交叉配置,但忽略GCOV_PREFIX和GCOV_PREFIX_STRIP

我想使用GCOV进行代码覆盖,但测试将在另一台机器上运行。 因此,可执行文件中.gcda文件的硬连接路径将不起作用。 为了更改此默认目录,我可以使用GCOV_PREFIX和GCOV_PREFIX_STRIP env变量,如此处所述。 这是我使用的命令: $ export GCOV_PREFIX=”/foo/bar” $ export GCOV_PREFIX_STRIP=”3″ $ gcc main.c -fprofile-arcs -ftest-coverage $ strings a.out | grep gcda /home/calmarius/blahblah/main.c.gcda 路径保持不变。 有人有这方面的经验吗?

为什么GCC保持空function?

在大多数情况下,如果我想在C中创建一个可选function,我只需创建两个这样的函数: #ifdef OPTIONAL_SOMETHING void do_something(int n, const char *s) { while (n–) { printf(“%s”, s); } /* …You might get the point, really do something… */ } #else void do_something(int n, const char *s) { /* Empty body */ } #endif 因此,如果符号未定义 – 禁用该function时 – 将空函数编译到可执行文件中。 深入研究汇编列表,似乎GCC 在禁用优化时编译并调用空函数。 如果启用了优化 ,也使用了-O2和-O3 ,它只编译必要的堆栈处理代码,但它会优化调用指令。 总而言之,它保留了function。 大约相同的情况适用于非空但未使用的方法。 它应该简单地扔掉整个东西,但事实并非如此。 为什么它是默认行为? […]

指针类型不兼容

我有以下签名的function: void box_sort(int**, int, int) 和以下类型的变量: int boxes[MAX_BOXES][MAX_DIMENSIONALITY+1] 当我调用该函数时 box_sort(boxes, a, b) 海湾合作委员会给了我两个警告: 103.c:79: warning: passing argument 1 of ‘box_sort’ from incompatible pointer type (string where i am calling the function) 103.c:42: note: expected ‘int **’ but argument is of type ‘int (*)[11] (string where the function is defined) 问题是为什么 ? int x [] []和int […]

有没有办法在输出二进制文件中存储clang编译时标志?

有没有办法在使用clang时将编译时标志存储在输出二进制文件中? 比如跑完后: clang -O3 -c main.c 生成的main.o文件应该包含-O3 。 gcc有-frecord-gcc-switches但是我找不到clang的等价物。