实用程序编译选项

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/20/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


本文纯探讨技术实现,请大家抱着学习交流之目的进行阅览。

-rpath和-rpath-link的区别

(1)-rpath和-rpath-link都可以在链接时指定库的路径;
(2)运行可执行文件时,-rpath-link指定的路径不再有效(链接器没有将库的路径包含进可执行文件中),
           而-rpath指定的路径还有效(因为链接器已经将库的路径包含在可执行文件中);
(3)-L指定的是链接时的库路径,生成的可执行文件在运行时库的路径仍由LD_LIBRARY_PATH环境变量指定;

(4)不管采用何种选项链接,当提示找不到动态库时均可通过设置LD_LIBRARY_PATH解决。
其中 $$ORIGIN表示文件的当前路径,./表示应用程序的路径,一般-rpath,'$$ORIGIN'才能获得想要的效果;
-rpath,'$$ORIGIN',--enable-new-dtags 会在程序中加再加(RUNPATH)标签,参考http://www.feitianzhi.com/boke/index.php/archives/21/

gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 减小程序体积

GCC链接操作是以section作为最小的处理单元,只要一个section中的某个符号被引用,该section就会被加入到可执行程序中去。因此,GCC在编译时可以使用 -ffunction-sections 和 -fdata-sections 将每个函数或符号创建为一个sections,其中每个sections名与function或data名保持一致。而在链接阶段, -Wl,–gc-sections 指示链接器去掉不用的section(其中-wl, 表示后面的参数 -gc-sections 传递给链接器),这样就能减少最终的可执行程序的大小了。
我们常常使用下面的配置启用这个功能:

CFLAGS += -ffunction-sections -fdata-sections
LDFLAGS += -Wl,--gc-sections

让make更透明些

在编译信息里面看到详细的gcc/g++的编译参数

make VERBOSE=1

在CMakeLists.txt里面加上这句指令也可以

set(CMAKE_VERBOSE_MAKEFILE ON)