在MacOS 10.9(Mavericks)上构建Boost.Python应用程序

eqz*_*qzx 5 c++ python compilation boost-python osx-mavericks

我升级到Mavericks,经过大量故障排除后现在无法构建我的应用程序。

链接期间,我收到错误消息

Undefined symbols for architecture x86_64:
  "boost::python::objects::function_object(boost::python::objects::py_function const&, std::pair<boost::python::detail::keyword const*, boost::python::detail::keyword const*> const&)
  .
  .
  .
 "boost::python::objects::register_dynamic_id_aux(boost::python::type_info, std::pair<void*, boost::python::type_info> (*)(void*))"
Run Code Online (Sandbox Code Playgroud)

我正在使用Macports中的g ++,特别是g ++-mp-4.4。Clang不是我的项目的选项,因为我的项目依赖于OpenMP,而OpenMP当前与Clang不兼容。

我没有使用过C ++ 11运行时,但是macports中的Boost.Python库(我在链接过程中使用的库)与此链接。

otool -L libboost_python-mt.dylib
libboost_python-mt.dylib:
    /opt/local/lib/libboost_python-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
Run Code Online (Sandbox Code Playgroud)

这是我问题的根源吗?使用Clang编译项目的一部分成功(并克服了此链接错误阶段),但是正如我提到的,我需要OpenMP。

值得注意的是,运行:

nm  libboost_python-mt.dylib | c++filt | grep boost::python::objects::function_object
Run Code Online (Sandbox Code Playgroud)

输出

0000000000013d60 T boost::python::objects::function_object(boost::python::objects::py_function const&)
0000000000013d00 T boost::python::objects::function_object(boost::python::objects::py_function const&, std::__1::pair<boost::python::detail::keyword const*, boost::python::detail::keyword const*> const&)
Run Code Online (Sandbox Code Playgroud)

带有std :: __ 1前缀,与未定义符号错误中的预期值不匹配...

eqz*_*qzx 3

该解决方案是通过安装并链接未使用 c++11 编译的 Boost 版本来实现的。Macports 提供的 Boost 版本显然是用 C++11 构建的 Boost.Python,尽管我特意将 Macports 编译器设置为 g++-mp-4.4,它不应该能够用 C++11 构建。 。

请注意,在撰写本文时,通过 Macports 安装用 g++ 编译的 Boost 库相当困难,我最终从源代码安装了 Boost 库。