gcc/g++ 常用参数

编译的步骤

参考:gcc参数详解 
gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步

1.预处理,生成.i的文件[预处理器cpp]。 对应的参数是 -E 
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]。对应的参数是 -S 
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]。对应的参数是 -c 
4.连接目标代码,生成可执行程序[链接器ld]。无参数。

编译步骤举例

有三个文件f1.h、f1.cc、test.cc 
内容分别为: 
f1.h

<!-- lang: cpp -->
void f1();

f1.cc

<!-- lang: cpp -->
#include <iostream>
#include "f1.h"

using namespace std;

void f1()
{
    cout << "f1()" << endl;
}

test.cc

<!-- lang: cpp -->
#include <iostream>
#include "f1.h"

using namespace std;

int main()
{
    f1();
    cout << "hello" << endl;
}

编译链接过程如下:

<!-- lang: shell -->
[root@VM-127-178 gcc_test]# ls
f1.cc  f1.h  test.cc
[root@VM-127-178 gcc_test]# g++ -S f1.cc
[root@VM-127-178 gcc_test]# g++ -S test.cc
[root@VM-127-178 gcc_test]# ls
f1.cc  f1.h  f1.s  test.cc  test.s
[root@VM-127-178 gcc_test]# g++ -c f1.s
[root@VM-127-178 gcc_test]# g++ -c test.s
[root@VM-127-178 gcc_test]# ls
f1.cc  f1.h  f1.o  f1.s  test.cc  test.o  test.s
[root@VM-127-178 gcc_test]# g++ f1.o test.o
[root@VM-127-178 gcc_test]# ls
a.out  f1.cc  f1.h  f1.o  f1.s  test.cc  test.o  test.s
[root@VM-127-178 gcc_test]# ./a.out
f1()
hello
[root@VM-127-178 gcc_test]#

当然,gcc很聪明,可以一个命令编译多个文件。如:

<!-- lang: shell -->
g++ -c f1.s test.s

同时支持通配符。可以这样:

<!-- lang: shell -->
g++ -o test *.cc

常用参数

-E 
  只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. 
  例子用法: 
  gcc -E hello.c > pianoapan.txt 
  gcc -E hello.c | more 
  慢慢看吧,一个hello word 也要与处理成800行的代码 
-S 
  只激活预处理和编译,就是指把文件编译成为汇编代码。 
  例子用法 
  gcc -S hello.c 
  他将生成.s的汇编代码,你可以用文本编辑器察看 
-c 
  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 
  例子用法: 
  gcc -c hello.c 
  他将生成.o的obj文件 
-o 
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感 
,改掉它,哈哈 
  例子用法 
  gcc -o hello.exe hello.c (哦,windows用习惯了) 
  gcc -o hello.asm -S hello.c 
-l 
  需要链接的库名称。即链接库文件去掉lib前缀和.so后的部分。如libev.so就是 -lev;libace.so就是 -lace。 
-L 
  链接库文件的搜索路径。 
  默认链接库的搜索路径为/lib和/usr/lib。 
  实际的搜索路径可以参见本博客的文章ldconfig , ldd 与 LD_LIBRARY_PATH 之间的关系 
  若安装了新的开发包需要配置系统的链接配置。详见 
-I 
  include头文件的搜索路径。 
  当有此选项时,优先搜索此路径下的头文件。然后按照#include后面是”“还是<>来决定是优先在当前目录搜索还是优先在系统目录搜索。 
  默认头文件的路径为当前目录./ 和系统目录 /usr/include /usr/local/include。 
-g 
  增加调试信息。 
-O0 
-O1 
-O2 
-O3 
  编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高。 
-imacros file 
  将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中 
   
-Dmacro 
  相当于C语言中的#define macro 
   
-Dmacro=defn 
  相当于C语言中的#define macro=defn 
   
-Umacro 
  相当于C语言中的#undef macro 
-undef 
  取消对任何非标准宏的定义

-w 
  不生成任何警告信息。 
-Wall 
  生成所有警告信息。

-static 
  此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行. 
-shared 
  编译成动态链接库。通常用在建立共享库时。 需要配合参数-fPIC使用。

某个程序在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须使用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址不无关代码(Position Independent Code (PIC))。注意:linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。转自gcc的静态库和动态库


FROM: http://my.oschina.net/u/1864567/blog/304351

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值