当我在英特尔编译器中使用boost-build时,使用内置的“英特尔”工具,它在将源代码编译为目标文件时使用icpc,但使用ar来创建.a静态库。通常这是非常好的,因为英特尔自己的归档程序xiar主要是ar的包装器。
但是,当我在大型应用程序中构建一些(但不是全部)库/模块时,我尝试使用英特尔的“过程间优化”(-ipo)选项。我希望它在库/模块内优化,而不是在库/模块之间优化。为此,我必须在制作.a文件时使用xiar或xild -lib,因为ar无法理解icpc -ipo创建的.o文件。它认为它成功了,但它生成的.a将在链接阶段失败。
如何将boost-build用于创建归档的命令从默认的ar更改为xiar
我尝试在我的user-config.jam中的using intel语句中加入<linker> (我看到msvc内置工具支持它),但它似乎被忽略了。我不知道这会不会影响存档程序的选择。
发布于 2015-07-22 05:50:34
我必须破解boost-build的内部结构才能使其正常工作。如果你需要这个功能,你也可以修改它!
在/usr/share/boost-build/tools/intel-linux.jam或/usr/share/boost-build/src/tools/intel-linux.jam (是否存在可能取决于boost-build版本)中,将以下内容添加到文件末尾:
actions piecemeal archive
{
"xiar" $(AROPTIONS) rc "$(<)" "$(>)"
"ranlib" "$(<)"
}这似乎覆盖了默认的archive (和piecemeal?)在gcc.jam中定义的操作。在这里,我显式地使用xiar而不是ar,其余的都是逐字复制的。
如果你没有使用Linux,你可以把同样的逻辑转移到intel-win.jam中。
我认为boost-build在这个假设中是有缺陷的,即使在英特尔编译器中也使用ar,所以这可能很快就会成为boost-build上的一个bug修复请求。我不确定我有最好的解决方案,但这总比没有好。
更好的做法是添加一个<archiver>特性。google搜索结果中提到了这样的事情,但boost-build ( 2011和2014版本之间)中肯定不存在这样的事情。显然,boost-build能够实现这样的功能。但我缺乏非常令人困惑的jam语言的技能,无法实现这一点。如果你有这样的技能,请分享。
https://stackoverflow.com/questions/30921686
复制相似问题