gcc的详细操作手册可参考:https://blog.csdn.net/earbao/article/details/53153853
g++的用法与gcc一致
最近在做python的c++扩展模块,用到了gcc编译器,现在来总结下,比如我用了下面指令
g++ -o _myso.so -shared -fpic -I/home/jerry/anaconda3/envs/tf13py36/include/python3.6m Extest2.cpp
那么里面的参数都有什么意义呢?
-o:指定生成可执行文件的名称,使用方法g++ -o afile file.cpp file.h..., 如果不使用-o选项,则会生成默认可执行文件a.out
ps:可执行文件不可与待编译文件或链接文件同名,否则会生成相应可执行文件且覆盖原编译或链接文件.
ps:在liux系统中,动态链接文件称为动态共享对象(DSO,Dynamic shared objects),简称共享对象,一般是以.so为扩展名的文件。在windows系统中,则称为动态链接库(Dynamic linking library),很多以.dll为扩展名。
-shared: 表明产生共享库,
-fPIC:则表明使用地址无关代码。PIC:position independent code.fpic的目的是什么?共享对象可能会被不同的进程加载到不同的位置上,如果共享对象中的指令使用了绝对地址,外部模块地址,那么在共享对象被加载时就必须根据相关模块的加载位置对这个地址做调整,也就是修改这些地址,让它在对应进程中能正确访问。
-I(大写i):编译程序按照-I指定的路径进去搜索头文件
-I/home/include
表示将/home/include目录作为第一个寻找头文件的目录,若找不到需要的头文件,系统会自动到/usr/include找,若还找不到就会到usr/local/include中找
ps:linux下编译共享库时,必须加上-fPIC参数,否则在链接时会有错误提示(有资料说AMD64的机器才会出现这种错误
-c: 只编译、汇编不链接,只生成目标文件(.o)。
$g++ -c main.s -o main.o
会生成一个main.o的目标文件。
ps:我在执行python setup.py build时,在终端发现了下面语句
gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/jerry/anaconda3/include/python3.6m -c Extest2.cpp -o build/temp.linux-x86_64-3.6/Extest2.o
这是不是就意味着只用gcc编译器编译,里面有-c指令, 是不是这就意味着只编译而不链接呢?
-pthread:用于在编译时增加多线程支持,该选项同时对"预处理器“和”链接器“产生作用,这个参数既不影响编译器产生的目标代码的线程安全性,也不影响对提供的支持多线程的函数库libaries的选择。
-Wsign-compare:在有符号数和无符号数进行值比较时,有符号数可能在比较之前被转换为无符号数而导致结果错误,使用该选项会对这样的情况给出警告。
/* * test_sign_compare.c */ #include
int main()
{
unsigned int i = 128;
signed int j = -1;
if (i < j)
{printf("i < j\n"); }
else
{printf("i > j\n");}
return 0;
}
gcc -Wsign-compare test_sign_compare.c test_sign_compare.c: In function `main': test_sign_compare.c:10: warning: comparison between signed and unsigned
-DNDEBUG:NDEBUG是一个标准的ANSI宏,表示不进行调试编译。
-g:为了调试用的,加个-g是为了gdb用,不然gdb用不到
-wall:显示警告信息;
-fwrapv:假定有符号运算溢出时回绕
-Wstrict-prototypes:使用了非原型的函数声明时给出警告