【问题标题】:Compiling a full static executable in Visual Studio 2010 with boost library在 Visual Studio 2010 中使用 boost 库编译完整的静态可执行文件
【发布时间】:2016-09-29 02:22:36
【问题描述】:

我正在尝试使用 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++ -> 代码生成:运行时库多线程

C/C++ -> 预编译头文件:不要使用

链接器-> 输入:附加依赖项:所有使用的 BOOST LIB 文件的完整路径 (C:\boost_1_61_0\stage\lib\libboost_system-vc100-mt-gd-1_61.lib....)

我可以编译动态链接的可执行文件,但如果我尝试静态可执行文件,我会收到以下错误:

1>链接:致命错误 LNK1104:无法打开文件“libboost_system-vc100-mt-sgd-1_61.lib”

问题出在哪里?

【问题讨论】:

    标签: c++ visual-studio-2010 boost compilation executable


    【解决方案1】:

    属性不应以-- 为前缀,因此您的构建命令应类似于:

    b2 工具集=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' 版本是发布库,'sgd' 版本是调试库。请参阅boost docs,了解每个字符的确切含义。


    编辑:再次查看您的设置后,您似乎已经手动指定了您正在使用的所有 boost 库的路径。除了我上面提到的关于构建属性的内容之外,您还应该在VC++ Directories -> Library Directories 下指定库搜索路径。在 Visual Studio 中,boost 将使用 #pragma comment(lib, ...) 预处理器指令指定它需要哪些库。您可以通过在包含其标头之前定义 BOOST_<lib>_NO_LIB 为单个库禁用此行为,或者通过定义 BOOST_ALL_NO_LIB 为所有库禁用此行为。

    【讨论】:

    • 对!我想我做得对,但在这里写错了。无论如何,我会再次编译它以确保。
    • 我的预处理器定义现在看起来像这样:WIN32 NDEBUG _CONSOLE BOOST_ALL_NO_LIB #pragma comment(lib, "boost_system") #pragma comment(lib, "boost_regex") #pragma comment(lib, "boost_date_time") #pragma 注释(lib,“boost_serialization”)#pragma 注释(lib,“boost_thread”)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多