《专业嵌入式软件开发》笔记-第4章

4 篇文章 0 订阅
2 篇文章 0 订阅

 第4章 gcc

4.0.1 linux非实时操作系统包括RedHat Linux、Fedora、Ubuntu、CentOS等;Linux实时操作系统包括Monta Vista Linux、WindRiver Linux(VxWorks,已被Intel收购)、RTLinux等。

4.1.1 交叉编译器  

4.2.1 gcc -E file.c >file.pre.c 得到预处理过的源文件。

         从file.pre.c文件总看到大量以#开头的行。每行的格式是“#” 行号 文件名 标志,如

               # 35 "/usr/include/stdio.h" 2 3 4
    
其中“行号”与“文件名”表示从它后一行开始的内容来源于哪个文件的哪一行;

        标志可以是1、2、3和4四个数字,每个数字的含义:

       数字 |                 含义

          1   | 表示一个新文件的开始

          2   | 表示从一个被包含的文件中返回

          3   | 表示后面的内容来自系统头文件

          4   | 表示后面的内容应当被当作一个隐式的‘extern “C”’块

4.3.2 gcc -S file.c 得到file.s汇编代码 可以加入-O2优化

4.3.3 gcc -v file.c 获取系统头文件路径

4.3.4 产生映射文件 gcc -W1,-Map=file.map file.c -o file

         会生成file.map文件

         map文件除了包含nm工具所获取的信息外,还包含各符号来源于哪一个库及库中哪一个目标文件等更为详细的信息。

        语法:-Wl(注意是小写的L)用于指定传递给链接器的选项,-Map=file.map(=号换成,亦可以)由gcc传递给链接器以指示链接器为我们生成名为file.map的映射文件。

4.3.5 -DMACRO  相当于在文件中#define MACRO

4.3.6 gcc -M file.c 输出文件的依赖关系(包括系统头文件), -MM输出不包含系统头文件的依赖关系

         makefile中可运用此选项生成依赖关系

4.3.7 gcc -o main.c -Lpath -lname 在path路径下寻找名为libname.a的库链接

注意gcc 链接库有顺序

 

以下为转:

gcc在链接库文件时是从左到右扫描,而且不会重复扫描,这样任何函数的定义应该放在使用者的后面,不同的编译器对这个问题有不同的处理方式,有的编译器可以实现顺序无关,但在没有明确的情况下应该遵循原有的规则。

 
下面是有关gcc说明的一段话,摘自网络
On Unix-like systems, the traditional behavior of compilers and linkers
is to search for external functions from left to right in the object files
specified on the command line. This means that the object file which
contains the definition of a function should appear after any files which
call that function.

 
 
Most current compilers and linkers will search all object files, regardless
of order, but since not all compilers do this it is best to follow the
convention of ordering object files from left to right.

 

 

gcc提供了另外的方式的来解决这个问题

g++ -o main main.cpp -L../lib2-64/dict/lib -L../lib2-64/ullib/lib -Xlinker "-(" -ldict -lullib -Xlinker "-)"

可以看到我们需要的库被 -Xlinker "-(" 和 -Xlinker "-)"  包含起来,gcc在这里处理的时候会循环自动查找依赖关系,不过这样的代价就是延长gcc的编译时间,如果使用的库非常的多时候,对编译的耗时影响还是非常大.

-Xlinker有时候也简写成"-Wl, ",它的意思是 它后面的参数是给链接器使用的.-Xlinker 和 -Wl 的区别是一个后面跟的参数是用空格,另一个是用","

g++ -o main main.cpp -L../lib2-64/dict/lib -L../lib2-64/ullib/lib -Wl,"-(" -ldict -lullib -Wl,"-)"

 

参看:http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/

http://www.cppblog.com/findingworld/archive/2008/11/09/66408.html

http://hi.baidu.com/herejing/blog/item/ca31c8d6d0d9f12206088b0b.html

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值