我正在为一个名为AMX Mod X的开源项目做贡献。它使用了非常简单的定制构建系统(称为AMBuild)。该项目是在Linux上使用Clang构建的。
我只是通过传递编译时和链接时参数来尝试启用LTO。
我添加了一个链接时间参数
-O2 -flto=thin -fuse-ld=lld -Wl,-z,notext
并作为编译时参数。
-O2 -flto=thin -fPIC
我在仔细搜索后选择了此配置。看来我非常接近实现完整的LTO。只有一个模块无法构建,它与pcre链接。
(由构建系统生成的)链接命令是这样的。
clang-4.0 _public_sdk_amxxmodule.o module.o CRegEx.o utils.o -m32 -O2 -flto=thin -fuse-ld=lld -Wl,-z,notext -ldl -lm -lgcc_eh ../../../support/versionlib/version/libversion.a /home/travis/build/alliedmodders/amxmodx/modules/regex/lib_linux/libpcre.a -shared -o regex_amxx_i386.so
链接错误很多,但是非常相似。这就是其中之一。
/usr/lib/llvm-4.0/bin/ld.lld: error: pcre_compile.c:(function add_to_class): can't create dynamic relocation R_386_32 against symbol '_pcre_ucd_stage1' defined in /home/travis/build/alliedmodders/amxmodx/modules/regex/lib_linux/libpcre.a(libpcre_la-pcre_ucd.o)
我read认为LLD和bfd具有不同的默认值,并且-Wl,-z,notext
应该起作用,但没有任何效果。
libpcre.a只是与存储库捆绑在一起的二进制文件。 AMBuild并非从源头上构建pcre。这是我的PR,您会发现travis构建失败,并且更仔细地阅读了日志。不要害怕自定义构建系统,所有执行的命令都以最详细的形式打印到终端。没问题。
与pcre链接时如何启用LTO?我真的不在乎其他编译器(gcc,icc等)或其他操作系统。
UPD : LTO 代表 L 墨水 T ime O 优化< / p>