C程序的编译和链接 - gcc
2015-01-05 21:23
363 查看
gcc 工具调用 C预处理器、C编译器、汇编器和连接器。
C预处理器: 扩展宏定义并包含头文件
C编译器: 根据源文件中的指令创建汇编语言代码
汇编器 : 创建计算机刻度的目标文件,每个源文件都会创建一个目标文件
连接器 : 连接器搜索指定的函数库,找到程序使用的函数,并将这些函数的目标模块与本程序的目标代码合并在一起。
默认情况下,C编译器会连接标准C函数库libc.o
如果希望连接器搜索其他函数库,用户必须在命令行上使用 -l ( 小写l ) 选项指定这些函数库。与大多数Linux系统工具选项不同,-l 选项在命令行上的位置并不是在所有文件名之前,而是通常出现在所有应用它的模块的文件名之后。
在下面的示例中,C 编译器搜索数学函数库 libm.o
$ gcc calc.c -lm
% -l 选项使用函数库名称约定,将跟在-l后面的那个字母追加到lib后面,并添加扩展名.so 或者.a.
本例中的m代表libm.so
使用相同的命名机制,可以使用下面的命令连接到名为libgraphics.a的图形函数库:
$ gcc pgm.c -lgraphics
如果使用这个约定来命名函数库,gcc知道在/usr/lib 和/lib中搜索这些函数库。还可以使用-L选项让gcc搜索其他目录:
$ gcc pgm.c -L/usr/XllR6/lib -lgraphics
在这个示例中,gcc在搜索/usr/lib和/lib目录之前,在工作目录和/usr/XllR6/lib中搜索函数库文件libgraphics.a
gcc 和编译有关的选项
-c 只激活预处理、编译和汇编,生成扩展名为.o 的目标代码文件
-S 只激活预处理和编译,生成扩展名为.s的汇编代码文件
-E 只激活预处理,并将结果输出至标准输出
-g 为调试程序(如gdb)生成相关信息
-c 选项在编写大型程序时是必须的。存在依赖关系的源代码文件总是需要首先编译成目标代码,最后一起连接成可执行文件。
依据以上四步,依次生成
经预处理的C原始程序 *.i , 汇编语言原始程序 *.s , 二进制目标代码 *.o , 连接后生成可执行文件
摘自: 李玉波等, 《Linux C 编程》
---------------------------------------------------------------------------
g++ my_main.cpp -o my_mian -I /usr/local/include -L /usr/local/lib -lopencv_imgproc -lopencv_core -lopencv_highgui
注:-I 为大写的字母i, 是包含头文件
-L 为包含的库文件路径, 后面是包含的具体的三个库函数
C预处理器: 扩展宏定义并包含头文件
C编译器: 根据源文件中的指令创建汇编语言代码
汇编器 : 创建计算机刻度的目标文件,每个源文件都会创建一个目标文件
连接器 : 连接器搜索指定的函数库,找到程序使用的函数,并将这些函数的目标模块与本程序的目标代码合并在一起。
默认情况下,C编译器会连接标准C函数库libc.o
如果希望连接器搜索其他函数库,用户必须在命令行上使用 -l ( 小写l ) 选项指定这些函数库。与大多数Linux系统工具选项不同,-l 选项在命令行上的位置并不是在所有文件名之前,而是通常出现在所有应用它的模块的文件名之后。
在下面的示例中,C 编译器搜索数学函数库 libm.o
$ gcc calc.c -lm
% -l 选项使用函数库名称约定,将跟在-l后面的那个字母追加到lib后面,并添加扩展名.so 或者.a.
本例中的m代表libm.so
使用相同的命名机制,可以使用下面的命令连接到名为libgraphics.a的图形函数库:
$ gcc pgm.c -lgraphics
如果使用这个约定来命名函数库,gcc知道在/usr/lib 和/lib中搜索这些函数库。还可以使用-L选项让gcc搜索其他目录:
$ gcc pgm.c -L/usr/XllR6/lib -lgraphics
在这个示例中,gcc在搜索/usr/lib和/lib目录之前,在工作目录和/usr/XllR6/lib中搜索函数库文件libgraphics.a
gcc 和编译有关的选项
-c 只激活预处理、编译和汇编,生成扩展名为.o 的目标代码文件
-S 只激活预处理和编译,生成扩展名为.s的汇编代码文件
-E 只激活预处理,并将结果输出至标准输出
-g 为调试程序(如gdb)生成相关信息
-c 选项在编写大型程序时是必须的。存在依赖关系的源代码文件总是需要首先编译成目标代码,最后一起连接成可执行文件。
依据以上四步,依次生成
经预处理的C原始程序 *.i , 汇编语言原始程序 *.s , 二进制目标代码 *.o , 连接后生成可执行文件
摘自: 李玉波等, 《Linux C 编程》
---------------------------------------------------------------------------
g++ my_main.cpp -o my_mian -I /usr/local/include -L /usr/local/lib -lopencv_imgproc -lopencv_core -lopencv_highgui
注:-I 为大写的字母i, 是包含头文件
-L 为包含的库文件路径, 后面是包含的具体的三个库函数
相关文章推荐
- GCC/LD编译链接潜规则 (第四弹) : ld 会把所有通过-l指定的动态库全部链接进最终的目标程序中, 无论是否真的用到(导致生产环境加载失败)
- 【Linux】使用vim编写一个程序,gcc查看预处理、编译、汇编、链接过程
- 程序中引入库文件的头文件 编译时并不需要显示的用gcc去链接他的库文件 why?
- GCC 显示程序详细编译-链接过程
- eclipse下添加GCC编译器的编译链接库以及程序运行参数方法
- GCC 预处理 编译 汇编 链接全过程及其含义 程序的开始不是main函数
- 用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)
- gcc编译程序的四个阶段(预处理-编译-汇编-链接)
- 1.2.在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。并熟悉相关指令。
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- gcc程序的编译过程和链接原理
- 使用gcc 5 编译c++11编写的程序 出现的符号找不到的链接问题。
- eclipse下添加GCC编译器的编译链接库以及程序运行参数方法
- 抽取VS文件组成类GCC的编译器,并编译C程序为dll动态链接库
- 用GCC编译链接程序--编译链接器GCC常用功能
- eclipse下添加GCC编译器的编译链接库以及程序运行参数方法
- 结合"hello world"探讨gcc编译程序的过程
- 用gcc编译成执行程序
- gcc编译报错:程序中有游离的‘\357’‘\273’‘\277’等
- gtk程序编译和链接过程