Chinaunix首页 | 论坛 | 博客
  • 博客访问: 391792
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 560
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-10 08:38
文章分类
文章存档

2016年(32)

2015年(48)

我的朋友

分类: LINUX

2015-10-10 11:20:41

今天做了几个小测试,看看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) |
给主人留下些什么吧!~~