我尝试构建不依赖项目运行时版本(MT或MD)的静态Boost库。构建此类库的唯一要求是在命令行中添加/Zl
选项。
我编辑了tools/build/src/user-config.jam
并在此处指定编译器标志:
using msvc : : : <cxxflags>/Zl ;
当我打开由boost build系统生成的rsp
文件时,我在这里看到/Zl
标志,例如在regex.obj.rsp
中:
"libs\regex\build\..\src\regex.cpp" -Fo"bin.v2\libs\regex\build\msvc-14.1\release\address-model-64\link-static\runtime-link-static\threading-multi\regex.obj" -TP /O2 /Ob2 /W4 /GR /MT /Zc:forScope /Zc:wchar_t /favor:blend /wd4675 /EHs /Zl -c
-DBOOST_ALL_NO_LIB=1
-DNDEBUG
"-I."
因此,对我来说,结果库可以同时链接/ MD和/ MT。但是,事实并非如此:
libboost_regex.lib(regex.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease'
此技巧(使用/Zl
)对我来说适用于zlib
,openssl
,libcurl
,libsqlite3
和许多其他库;谁能解释为什么它不适用于boost
吗? boost
是否以某种方式覆盖了/Zl
选项,即使它存在于rsp
文件和user-config.jam
中,还是为什么boost
库甚至要求{{1 }}选项是否应该使其与运行时无关?