【问题标题】:Boost autolinks libraries which are not built by Boost, but the intended ones are builtBoost 自动链接库不是由 Boost 构建的,但预期的库是构建的
【发布时间】:2010-08-11 15:57:42
【问题描述】:

我正在开发一个可以通过编写 python 脚本来扩展的数学应用程序。

我正在使用 Qt 4.6.3(构建为静态库,调试和发布版本)和 Boost 1.43.0(构建为静态库,运行时链接也设置为静态,多线程版本,调试和发布)。一切都是用 MSVC++2008 构建的。 Boost 构建了以下库:

  • libboost_python-vc90-mt-s-1_43.lib
  • libboost_python-vc90-mt-s.lib
  • libboost_python-vc90-mt-sgd-1_43.lib
  • libboost_python-vc90-mt-sgd.lib

我的项目可以编译,但在链接阶段出现以下错误:

1>Linking...
1>LINK : fatal error LNK1104: cannot open file 'boost_python-vc90-mt-gd-1_43.lib'

为什么它没有选择我编译的库之一?

我认为库名称中的 s 代表静态,但是自动链接功能似乎选择了一个动态库,我希望它全部静态链接到一个可执行文件中。

正则表达式库也是如此:我编译了相同的 4 个正则表达式库,快速测试显示此链接错误:

1>LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc90-mt-gd-1_43.lib'

怎么办?

【问题讨论】:

  • 你告诉vc++这些库在哪里吗?这不是通灵的。
  • 是的,库和包含路径设置正确(检查 3 次后)。它只想要不存在的文件名。但是我想要的库版本已经编译好了!

标签: c++ visual-studio-2008 boost static-linking boost-python


【解决方案1】:

您可以定义 BOOST_ALL_NO_LIB。这会阻止自动链接 boost 库,然后您必须手动链接所需的 boost 库。

【讨论】:

    【解决方案2】:

    如果 's' 确实代表静态(我不知道所有这些修饰符),请在编译时定义 BOOST_ALL_DYN_LINK 符号(将其添加到命令行选项中)。它告诉 boost 链接到 DLL 库。或者,编译/安装静态 boost 库。

    【讨论】:

    • 但是我编译并安装了boost静态库,我想链接到它们!我不想在我的应用程序中分发 DLL。
    【解决方案3】:

    问题已解决,在编译 boost 库的过程中,我选择了 link=static 选项。它创建了静态库。我还选择了 runtime-link=static 选项,这是错误的!

    这个问题的解决方案是使用 runtime-link=shared 编译 boost。现在添加了一些具有正确文件名的额外库,因此链接器可以找到它们。起初,编译器仍然会搜索 dll 库(boost_python-vc90-mt-gd-1_43.lib,而不是 libboost_python-vc90-mt-gd-1_43.lib),从自动链接到静态库的所有其他内容,但是因为 boost.python 设置了不同的自动链接,所以当你提供 BOOST_PYTHON_STATIC_LIB 时,它最终会链接到正确的库并且可以正常工作!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      相关资源
      最近更新 更多