linux生成动态库和静态库

GCC 编译过程示意图
gcc -E 文件名.c -o *.i --> *.i <-- 用i做扩展名是因为规定*.i文件为已经预处理过的C源代码
预处理后的 C 文件,预处理后即停止,不进行编译,预处理后的代码送往标准输出,所以要用-o来输出成文件;

gcc -S 文件名.c --> *.s
编译后即停止,不进行汇编,对于每个输入的非汇编语言文件,输出文件是汇编语言文件;
如果没有使用`-o'选项,默认的输出结果是:文件名.s <-- 汇编文件

gcc -c 文件名.c --> *.o
编译或汇编源文件,但是不作连接,编译器输出对应于源文件的目标文件;
如果没有使用`-o'选项,默认的输出结果是: 文件名.o <-- 目标文件

注:以上三个选项不能组合使用,因为它们各是在产生一个新可执行程序的一个阶段后停止输出。

gcc 文件名.c -o 文件名--> 文件名
指定输出文件为指定文件名,该选项不在乎 gcc 产生什么输出
(可执行文件,目标文件,汇编文件还是预处理后的 C 代码)
如果没有使用`-o'选项,默认的输出结果是:可执行文件为 a.out
如果gcc后没有以上三个选项之一,就会完成:预处理,编译,汇编,连结,四个阶段产生新可执行程序。

基本语法结构:(由以下四部分组成)
gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明)
gcc 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) -o 可执行文件名
注意两点:1. gcc永远在首,2. 库永远在依赖文件(*.c/*.cpp/*.o)之后;

gcc编译时链接库选项问题:
gcc -o test -I. str_out.h -L. -lstr_out main.c
无法通过编译,说不能正确链接库函数

而改为
gcc -o test main.c -I. str_out.h -L. -lstr_out
就正确编译了!!!

经查找资料发现,
-l 选项的位置是有意义的,
gcc在处理 -l 选项链接的库的时候,只会查找出现在它前面的文件中所需要链接的符号,如:
gcc -o foo file1.c -lm file2.c
中 gcc 处理 m 库时只会链接 file1.c 中用到的库函数,
而如果 file2.c 中也用到 m 库,它是不能正确链接的。
所以一般将 -l 选项放在 依赖文件集(*.c/*.cpp/*.o) 的后面。

多个库文件要链接时,一定要每个库文件前都有一个 -l 选项!

也可以写成如下形式:
gcc -o test main.c -I. str_out.h -L. ./libstr_out.a
因为,指定 -l 选项 和 指定文件名 的唯一区别是:
-l 选项用 lib 和 .a 或 .so 把 library 包裹起来,而且搜索一些目录。
(默认的库文件位于/usr/lib/或/usr/local/lib/目录中)

原文:http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Link-Options.html#Link-Options
-llibrary
-l library <-- 是不推荐的
Search the library named library when linking.
当链接时搜索名为 library 的库文件。

(The second alternative with
the library as a separate argument is only for POSIX compliance and is not recommended.)
(有第二种供选择的方式,即参数 库文件名 是与-l分开的,
这种方式只有 POSIX 遵守,并且是不推荐的)

It makes a difference where in the command you write this option;
the linker searches and processes librari
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值