这篇文档主要对gcc静态函数库(static library)以及动态函数库(shared library)的编译生成以及使用进行一个简短的学习。
GCC函数库
基础知识
C编程中的相关文件后缀
| 后缀 | 文件 |
| :–: | ————- |
| .a | 静态库 |
| .c | C源代码(需要编译预处理) |
| .h | C源代码头文件 |
| .i | C源代码(不需编译预处理) |
| .o | 对象文件 |
| .s | 汇编语言代码 |
| .so | 动态库 |常用编译运行模式
1234# 编译链接gcc -Wall helloubuntu.c -o helloubuntu# 运行./helloubuntu注意:
若用到math.h库等非gcc默认调用的标准库,请使用
-lm
参数常见编译器选项:
-c
:只编译生成目标文件,默认的输出文件的文件名同源代码文件名一致-Wall
:生成所有警告信息-w
:不显示任何警告信息-g
:生成调试信息-lLIBRARY
: 连接时搜索指定的函数库LIBRARY。-LDIRECTORY
: 指定额外的函数库搜索路径DIRECTORY。-IDIRECTORY
:指定额外的头文件搜索路径DIRECTORY。-o
:指定生成的对象的文件名-O[0-3]
:数字越大,优化等级越高-E
:只进行编译预处理,若不指定输出对象,那么结果将在标准输出中列出,可以1$ gcc -E helloubuntu.c -o helloubuntu.i-S
:指示编译器生成汇编语言代码然後结束1$ gcc -S helloubuntu.c
静态库创建
静态库是编译器生成的普通的.o
文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。静态库的另一个名字叫归档文件(archive),管理这种归档文件的工具叫ar
。
|
|
注意:
上述两条命令效果相同,但是gcc找寻libhello.a的库的位置不同
- 指定完整的路径名可使编译器在给定的目录中寻找库。库名可以指定为绝对路径(比如 /usr/worklibs/libhello.a)或者相对与当前目录的路径(比如 ./lib/libhello.a)
- 选项
-l
不具有指定路径的能力,但是它要求编译器在系统库目录下找寻该库。
选项
-L
可以指定具体的目录,使编译器在搜寻系统库目录前先搜寻此目录12# 假设libhello.a 在当前目录的lib文件夹下。gcc -Wall -L ./lib/ twohellos.c -lhello -o twohellos
共享库构建
共享库是编译器以一种特殊的方式生成的对象文件的集合。对象文件模块中所有地址(变量引用或函数调用)都是相对而不是绝对的,这使得共享模块可以在程序的运行过程中被动态地调用和执行。
|
|
G++函数库
基础知识
Cpp编程中的相关文件后缀
| 后缀 | 文件 |
| :————————–: | ————— |
| .C .c .cc .cp .cpp .cxx .c++ | C++源代码(需要编译预处理) |
| .h | C或者C++源代码头文件 |
| .ii | C++源代码(不需编译预处理) |
| .o | 对象文件 |
| .s | 汇编语言代码 |
| .a | 静态库 (archive) |
| .so | 动态库 |
| \| 标准C++系统头文件 |
常用编译运行模式
1234# 编译链接g++ helloworld.cpp -o helloworld# 运行./helloworld注意:
程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示
12gcc helloworld.cpp -lstdc++ -o helloworld# 选项 -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libstdc++.a。而后它在标准库路径中查找该库。gcc 的编译过程和输出文件与 g++ 是完全相同的。编译器选项与GCC完全相同
静态库创建
同GCC
动态库创建
同GCC
Gfortran函数库
基础知识
Gfortran编程中的相关文件后缀
| 后缀 | 文件 |
| —————————————- | ————————- |
| .f .for .FOR .ftn* .f90* .f95* .f03 | Fortran源代码(不需编译预处理) |
| .F .fpp .FPP .FTN .F90* .F95* .F03* | Fortran源代码(需要编译预处理) |
| .r | Fortran源代码(需要RatFor编译预处理) |
| .o | 对象文件 |
| .s | 汇编语言代码 |
| .a | 静态库 (archive) |
| .so | 动态库 |注意:其中,标 * 的后缀名是gfortran的文件后缀,g77不能识别。
常用编译运行模式
1234# 编译链接gfortran helloworldff.f90 -o helloworldff# 运行./helloworldff注意:
编译选项同GCC相同
类似g++ ,gfortran 也只是设置过 Fortran 程序所需基本环境的 gcc 的一个前端。当我们运行 gfortran 时,实际上运行并不是这个编译器,而是编译器驱动器。该驱动器解析命令行中所给出的选项,然后才调用真正的编译器,汇编器和链接器。默认情况下,编译器驱动器根据命令行中给定的文件的后缀决定它自己下一步的动作:一个名为 foo.c 将传递给 C 编译器,而名为 foo.f95 的文件将传递给 Fortran 95 的编译器,等等。
12# 类似于 g++gcc helloworld.f -o helloworld -lgfortran -lgfortranbegin
静态库创建
同GCC
动态库创建
同GCC
参考: