o1群:最基本的优化级别。编译器会尝试生产更快,更小的代码没有太多编译时间。这是基本的,但它应该完成工作。
- 02:一步o1群。推荐的优化级别,除非系统有特殊需要。- 02将激活更多的旗帜除了o1群激活的。- 02,编译器将尝试提高代码性能不影响大小,和没有太多的编译时间。
o3:最高水平的优化成为可能。它使优化是昂贵的编译时间和内存使用量。编译与o3不是保证的方式来提高性能,事实上,在许多情况下,可以减缓系统由于更大的二进制文件和内存使用增加。o3也是打破几个包。不推荐使用o3。
操作系统:优化代码大小。激活所有- 02选项不增加生成的代码的大小。它可以用于机器有非常有限的磁盘存储空间和/或cpu小缓存大小。
og:在GCC 4.8中,一个新的一般优化级别,噩,引入了。它地址需要快速编译和优越的调试经验,同时提供一个合理的水平的运行时性能。整体发展经验应该比默认o0优化水平。注意,噩并不意味着- g,它只是禁用优化可能会干扰调试。
链接做了什么:把程序中所有的目标文件和所需文件的库文件连接在一起,最终生成一个可以直接运行的文件,称为执行文件。
静态编译static:
我们知道gcc的-static选项可以使链接器执行静态链接。但简单地使用-static显得有些’暴力’,因为他会把命令行中-static后面的所有-l指明的库都静态链接,更主要的是,有些库可能并没有提供静态库(.a),而只提供了动态库(.so)。这样的话,使用-static就会造成链接错误。
之前的链接选项大致是这样的,
1 | CORE_LIBS="$CORE_LIBS -L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib64 -lssl -lcrypto" |
修改过是这样的,
1 2 | CORE_LIBS="$CORE_LIBS -L/usr/lib64/mysql -Wl,-Bstatic -lmysqlclient \ -Wl,-Bdynamic -lz -lcrypt -lnsl -lm -L/usr/lib64 -lssl -lcrypto" |
其中用到的两个选项:-Wl,-Bstatic和-Wl,-Bdynamic。这两个选项是gcc的特殊选项,它会将选项的参数传递给链接器,作为链接器的选项。比如-Wl,-Bstatic告诉链接器使用-Bstatic选项,该选项是告诉链接器,对接下来的-l选项使用静态链接;-Wl,-Bdynamic就是告诉链接器对接下来的-l选项使用动态链接。下面是man gcc对-Wl,option的描述,
-Wl,option Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas. You can use this syntax to pass an argument to the option. For example, -Wl,-Map,output.map passes -Map output.map to the linker. When using the GNU linker, you can also get the same effect with -Wl,-Map=output.map.下面是man ld分别对-Bstatic和-Bdynamic的描述,
-Bdynamic -dy -call_shared Link against dynamic libraries. You may use this option multiple times on the command line: it affects library searching for -l options which follow it. -Bstatic -dn -non_shared -static Do not link against shared libraries. You may use this option multiple times on the command line: it affects library searching for -l options which follow it. This option also implies --unresolved-symbols=report-all. This option can be used with -shared. Doing so means that a shared library is being created but that all of the library's external references must be resolved by pulling in entries from static libraries.值得注意的是对-static的描述:-static和-shared可以同时存在,这样会创建共享库,但该共享库引用的其他库会静态地链接到该共享库中。