这两天维护公司工程的时候,发现很多大的项目在链接编译的时候都会加上很长的一段参数:
比如:-m32 -std=gnu++11 -g -Wall -Wextra -fpermissive -fextended-identifiers -Wno-unused-paramter -Wno-write-strings -D_init64=long\long -finstrument-functions -D_GNU_SOURCE -Wl,-export-dynamic -rdynamic -fprofile-arcs -ftest-coverage
因此就想吧一些常用的编译参数总结一下,方便以后查找;
-m32 生成32位机器的汇编代码;
-std=gnu++11 选择C语言编译标准,`c90',`c89',`c++0x'...;
-Wall 该选项意思是编译后显示所有警告;
-Wextra 检测更多的代码中的警告信息,比如if后面加分号,使用该参数可以报出警告;
-fpermissive 该选项会降低对代码检查的严格性,会将不一致代码的诊断从错误降级为警告;
-fextended-identifiers 允许字符中出现uncode字符\u \U;
-finstrument-functions 在每个函数的入口和出口处会各增加一个额外的hook函数的调用
-
void __cyg_profile_func_enter (void *this_fn, void *call_site);
-
void __cyg_profile_func_exit (void *this_fn, void *call_site);
-Wl statick 只能链接静态库,也就是说接在static后面的库都应该是静态库,实际编译的时候有可能是包含静态库和动态库两种情况,这时候就是应用Wl的时候;
-export-dynamic 就是这个选项让主程序内定义的全局函数对库函数可见;
-rdynamic 用来通知链接器将所有符号添加到动态符号表中
-fprofile-arcs 运行结束以后会生成一个xx.gcda文件,如果一个可执行文件带有“-fprofile-arcs”参数编译出来,并且运行过至少一次,就会生成。这个文件包含了程序基本块跳转的信息。接下来可以用gcov生成代码覆盖信息;
-ftest-coverage 编译后会得到一个可执行文件hello和hello.gcno文件,当用gcc编译文件的时候,如果带有“-ftest-coverage”参数,就会生成这个.gcno文件,它包含了程序块和行号等信息;
-fPIC 地址无关代码,