Windows和Unix操作系统下的文件扩展名
文件类型 Windows Mac OS X Unix
目标文件 .obj .o .o
静态库 .lib .a .a
动态库 .dll .dylib .so
可执行程序 .exe 无扩展名 无扩展名
不同工具集的命令行工具名
工具集 编译器 链接器 归档器
GCC gcc gcc ar,lanlib
创建目标文件
gcc -c -o 目标文件名 源文件列表
创建动态链接库
gcc -shared --fPIC -lrt -o 库名 目标文件列表
创建静态库
ar 库名 目标文件列表
ranlib 库名
创建可执行文件
gcc -o 可执行文件名 目标文件列表
参数说明
-Ipath用于指定一个包含路径,由预处理器在处理#include宏指令时使用
-Lpath用于指定静态库或动态库的路径
-lname用于指定具体的静态库或动态库,原文件名为libname.a或libname.so
--static用于指定链接时使用静态库,如果没有指定,则默认使用动态库,如果动态库不存在,则使用静态库,再如果静态库不存在,则报错
-Ipath在创建目标文件之前的预处理过程可用到
-Lpath和-lname在生成可执行文件时可以用到
在执行可执行文件时,哪里找相应的连接库函数
1. 在LD_LIBRARY_PATH环境变量指定的目录下(使用命令"export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH" 导出)
2. ld.so.cache文件该shared库对应的文件
3. /usr/lib和/lib目录下
在配置文件/etc/ld.so.conf中指定,可用命令ldconfig重新加载配置
编译参数的依赖库的顺序有要求吗?
在连接时,依赖库的指定顺序必须是写在前面的依赖写后面的
同一个库如果同时存在动态库和静态库,优先链接动态库,除非使用--static强制使用静态库
关于soname
-Wl,-soname
-Wl告诉编译器将后面的参数传递到连接器。而 -soname 指定了共享库的soname
示例:$(CC) -g -shared -Wl,-soname,$@.so.1 -o $(LIB)/$@.so.1.0 $^
连接文件或目录
ln -sf $@.so.1 $(LIB)/$@.so
-f或--force 强行建立文件或目录的连接,不论文件或目录是否存在
-s或--symbolic 对源文件建立符号连接,而非硬连接
常用命令行选项
-DNAME=VALUE: macro definition
-O: Optimize generated code
-Wall: Enable all compiler warnings
-g: Produce debugging symbols
阅读(2080) | 评论(0) | 转发(0) |