今天做了几个小测试,看看gcc和ar生成可执行程序到底有哪些小窍门:
1)gcc命令:
-o 紧跟着的后面是跟可以生成可执行程序名,然后后面跟需要编译的.c文件或者已经编译好的依赖文件(如库文件.a或者.o文件)。
如:gcc -o main.o main.c func1.a func2.o
-c是让gcc跳过链接的步骤,比如说你想建一个函数库,但是这个库引用了其它地方的函数,你暂时不想让它链接,则用这个选项。
2) ar命令:
ar命令感觉就是一个打包命令,可以把.o文件生成.a文件。但是注意了,我曾经想过,如果把多个.a文件再继续打包生成一个总的.a文
件,这样不是更好? 事实证明,ar命令倒是可以把多个.a 生成一个总的.a, 但是这个最后的总的.a是不能被当作库文件识别的。
举例:
新建几个文件,main.c funcAll.c func1.c func2.c,
每个文件中间仅仅分别定义了函数, main() funcAll() func1() func2()
其中, funcAll()会调用func1()和func2(),main()会调用funcAll().
1. 首先用gcc -c -o func1.o func1.c生成func1.o文件。(这里加编译选项-c就是为了生存.o这个库用的,否则直接编译的化,编译会报错)
2. 用gcc -c -o func2.o func2.c生成func2.o文件。
3. 用ar -cr func1.a func1.o生成func1.a文件。
4. 用ar -cr func2.a func2.o生成func2.a文件。 (注意这里已经生成了两个.a库文件了,func1.a func2.a)
5. 用gcc -c -o funcAll.o funcAll.c生成 funcAll.o 文件。
6. 注意, 这里,我想用ar -cr funcAll.a funkAll.o func1.a func2.a生成一个总的.a库文件 funcAll.a来给main调用,这里这个命令是可以
执行成功的,而且也会生成一个funcAll.a出来,但是后面执行到第7步的时候发现不能执行。
7. 用gcc -o main main.c funcAll.a 会提示报错!报错的原因就是找不到func1()和fun2()的定义。
这时候用objdump funcAll.a命令会发现,里面有三个文件:funcAll.o func1.a func2.a
所以,总结一下,ar命令生成.a的库,里面必须全部是.o组成的,里面不能还存在有.a文件,否则的话到最后链接的时候,肯定会提示
没有定义。也即.a里面不能再嵌套.a !
另外: .o文件可以通过 objdump -t 来显示看看里面编译进去了哪些函数
.so文件, 可以通过objdump -tT或者命令nm -D来看编译进去了哪些函数
阅读(2617) | 评论(0) | 转发(0) |