gcc/g++ 编译选项

下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: 

/* helloworld.cpp */  
#include <iostream>  
int main(int argc,char *argv[])  
{  
    std::cout << "hello, world" << std::endl;  
    return(0);  
}  
程序使用定义在头文件 iostream 中的 cout,向标准输出写入一个简单的字符串。该代码可用以下命令编译为可执行文件: 
$  g++ helloworld.cpp
编译器 g++ 通过检查命令行中指定的文件的后缀名可识别其为 C++源代码文件。编译器默认的动作:编译源代码文件生成对象文件(object file),链接对象文件和 libstdc++ 库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。程序可以这样来运行: 
$ ./a.out
hello, world
更普遍的做法是通过 -o 选项指定可执行程序的文件名。下面的命令将产生名为 helloworld 的可执行文件: 
$ g++ helloworld.cpp -o helloworld
在命令行中输入程序名可使之运行: 
$ ./helloworld
hello, world

gcc/g++ 在执行编译时,需要4步

  1.预处理,生成.i的文件[使用-E参数]

  2.将预处理后的文件不转换成汇编语言,生成文件.s[使用-S参数]

  3.有汇编变为目标代码(机器代码)生成.o的文件[使用-c参数]

  4.连接目标代码,生成可执行程序[使用-o参数]

-Wall
    显示所有警告信息(warning all)

-g
 只是编译器,在编译的时候,产生调试信息。

-O0
-O1
-O2
-O3
 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值

-Idir

  在你是用#i nclude"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如
果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他
会先在你所制定的目录查找,然后再按常规的顺序去找。

-Ldir
  制定编译的时候,搜索库的路径。比如你自己的库,能用他制定目录,不然
  编译器将只在标准库的目录找。这个dir就是目录的名称。

-llibrary
  制定编译的时候使用的库
  例子用法
  gcc -lcurses hello.c
  使用ncurses库编译程式

-Wl,option
  此选项传递option给连接程式;如果option中间有逗号,就将option分成多个选项,然
后传递给会连接程式。 

  gcc编译链接动态库时,很有可能编译通过,但是执行时,找不到动态链接库,那是

  因为-L选项指定的路径只在编译时有效,编译出来的可执行文件不知道-L选项后面的值,

  当然找不到。可以用ldd <your_execute>看看是不有 ‘not found’在你链接的库后面,

  解决方法是通过-Wl,-rpath=<your_lib_dir>,使得execute记住链接库的位置

    应用场景:

    服务器部署了多个server,每个server使用的库版本不相同。

  解决方法:

    各server可以在编译时加上-Wl,-rpath=./libs,将自己要用的库放入 ./libs 目录下。

    注意:

      ① Wl 大小写:W大写 l小写

      ② -rpath 前面有个 -

-o
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out

-rdynamic

  选项 -rdynamic 用来通知链接器将所有符号添加到动态符号表中
  (目的是能够通过使用 dlopen 来实现向后跟踪)

-fPIC 

  PIC就是position independent code

  PIC使.so文件的代码段变为真正意义上的共享。

  详见:http://blog.sina.com.cn/s/blog_54f82cc201011op1.html

-D

  表示:#define 
  如:-DPOSGP730 等价于 #define POSGP730

 

posted @ 2017-10-24 11:07  那一剑的風情  阅读(3331)  评论(1编辑  收藏  举报