gcc/g++ 编译选项
下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码:
/* helloworld.cpp */ #include <iostream> int main(int argc,char *argv[]) { std::cout << "hello, world" << std::endl; return(0); }
$ 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