现在位置: 首页 > GCC
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func'     关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。 1.链接时缺失了相关目标文件(.o) 测试代码如下:     然后编译。 gcc -c test.c gcc –c main....
阅读全文
1.extern "C"的理解: 很多人认为"C"表示的C语言,实际并非如此,"C"表示的是一种链接约定,只是因C和C++语言之间的密切关系而在它们之间更多的应用而已。实际上Fortran和汇编语言也常常使用,因为它们也正好符合C实现的约定。 extern "C"指令描述的是一种链接约定,它并不影响调用函数的定义,即使做了该声明,对函数类型的检查和参数转换仍要遵循C++的标准,而不是C。 2.extern &quo...
阅读全文
1.概念和区别:     静态库就是在编译过程中一些目标文件的集合。静态库在程序链接的时候使用,链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中。一旦链接完成,在执行程序的时候就不需要静态库了。     由于每个使用静态库的应用程序都需要拷贝所用函数的代码,所以静态链接的文件会比较大。     相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码...
阅读全文
1 库的分类 根据链接时期的不同,库又有静态库和动态库之分。 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。 有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么) 2 静态库和动态库的比较 链接静态库其实从某种意...
阅读全文
2017-12-17 06:07 工业·编程 ⁄ 共 1365字 暂无评论
链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件。在链接过程中,它必须把符号(变量名、函数名等一些列标识符)用对应的数据的内存地址(变量地址、函数地址等)替代,以完成程序中多个模块的外部引用。 而且,链接器也必须将程序中所用到的所有C标准库函数加入其中。对于链接器而言,链接库不过是一个具有许多目标文件的集合,它们在一个文件中以方便处理。 当把程序链接到一个链接库时,只会链接程...
阅读全文
2017-12-10 05:58 工业·编程 ⁄ 共 592字 暂无评论
gcc 是一个功能强大的编译器,其编译选项非常多。有些选项一般程序员根本不会用到。因此将所有的编译选项全部列出讲解是不明智的。下面只对一些 gcc 编译器的常 用选项进行详细的讲解,这些选项在实际编程过程中非常实用。 注意:gcc 编译选项会区分大小写。因此-o选项和-O选项的效果是不一样的。前者表示源文件编译成为可执行文件,后者表示将源文件编译成为可执行文件并且进行一级优化。 -S 将C语言源文件编译为汇编语言,但...
阅读全文
2017-12-03 05:53 工业·编程 ⁄ 共 649字 暂无评论
如果想创建一个动态链接库,可以使用 GCC 的-shared选项。输入文件可以是源文件、汇编文件或者目标文件。 另外还得结合-fPIC选项。-fPIC 选项作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code);这样一来,产生的代码中就没有绝对地址了,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。 例如,从...
阅读全文
2017-11-27 05:47 工业·编程 ⁄ 共 576字 暂无评论
//main.c int main() { test(); } //test.c #include <stdio.h>   void test() { printf("test\n"); } 1、将test.c与main.c转换为目标文件test.o,main.o: gcc -c main.c test.c 2、将两者链接成可执行文件: gcc test.o main.o -o liu 3、将test.o打包为动态库文件libtest.so: gcc -fPIC -c test.c -o test.o gcc --share test.o -o libtest.so or: gcc -fPIC -shared test.c -o libtest.so 4、将t...
阅读全文
2017-11-20 05:36 工业·编程 ⁄ 共 1184字 暂无评论
首先说明:gcc 和 GCC 是两个不同的东西 GCC:GNU Compiler Collection(GNU 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。 gcc是GCC中的GUN C Compiler(C 编译器) g++是GCC中的GUN C++ Compiler(C++编译器) 一个有趣的事实就是,就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已,比如,用gcc编译一个c文...
阅读全文
2017-10-30 22:03 工业·编程 ⁄ 共 289字 暂无评论
1.预处理     --E 1.宏替换 2.头文件展开 3.注释去掉 4.xxx.c -> xxx.i 2.编译     --S 1.xxx.i -> xxx.s 2.汇编文件 3.汇编     -C 1.xxxx.S -> xxx.O 2.二进制文件 4.链接 --o  1.xxx.O -> xxx(可执行文件) gcc工作流程图 gcc常用参数 -v/ –version -I 编译的时候指定头文件路径 -c 1.将汇编文件生成二进制文件,得到一个.O文件 2.源代码 -O 指定...
阅读全文