3

我正在开发一个可以通过编写 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'

该怎么办?

4

3 回答 3

7

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

于 2010-08-12T05:44:48.453 回答
3

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

于 2010-08-11T17:14:17.213 回答
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 时,它最终会链接到正确的库并且可以正常工作!

于 2010-08-11T19:01:01.580 回答