我试图使用MS Visual C ++ - Express编译完整的独立静态可执行文件。
我使用了boost库,它们也是用静态链接编译的:
b2 --toolset = msvc-10.0 --link = static runtime-link = static variant = release threading = multi
在Visual Studio中,我有以下设置:
常规:MFC使用静态库
VC ++目录 - >包括目录:提升文件的途径
C / C ++ - >代码生成:运行时库Muthithreaded
C / C ++ - >预编译标题:不要使用
链接器>输入:附加依赖项:所有使用的BOOST LIB文件的完整路径 (C:\ boost_1_61_0 \阶段\ lib中\ libboost_system-VC100-MT-GD-1_61.lib ....)
我可以编译动态链接的可执行文件,但如果我尝试静态可执行文件,则会收到此错误:
1> LINK:致命错误LNK1104:无法打开文件' libboost_system-vc100-mt-sgd-1_61.lib'
问题出在哪里?
答案 0 :(得分:1)
属性不应以--
为前缀,因此您的构建命令应如下所示:
b2 toolset = msvc-10.0 link = static runtime-link = static variant = release threading = multi
此外,您似乎在调试模式下构建项目,因此链接器正在寻找boost库的调试版本。构建调试版和发布版可能是个好主意,这样您就可以在调试和发布模式下构建项目:
b2 toolset = msvc-10.0 link = static runtime-link = static variant = debug,release threading = multi
这将生成每个库的两个版本,'libboost_foo-vc100-mt-s-1_61.lib'和'libboost_foo-vc100-mt-sgd-1_61.lib'。 's'版本是发行版lib,'sgd'版本是调试库。请参阅boost docs,了解每个字符的确切含义。
编辑:再次查看您的设置后,看起来您已手动指定了您正在使用的所有提升库的路径。除了我上面提到的有关构建属性的内容之外,您还应在VC++ Directories -> Library Directories
下指定库搜索路径。在Visual Studio中,boost将使用#pragma comment(lib, ...)
预处理程序指令指定所需的库。您可以通过在包含其标头之前定义BOOST_<lib>_NO_LIB
或通过定义BOOST_ALL_NO_LIB
来定义所有库来禁用单个库的此行为。