从 .cpp 制作 .so:体系结构的未定义符号 x86_64:Boost.Python MacPorts GCC6 不是 Clang

Making .so from .cpp: Undefined symbols for architecture x86_64: Boost.Python MacPorts GCC6 not Clang

我正在尝试遵循 Exposing Classes tutorial for Boost.Python at Boost.org. I already did the first tutorial successfully and when commenting out the code, the error occurs as soon as the class appears. The part where everything falls apart is in the making of the .so file from the .cpp file. I get the apparently common : 'Undefined symbols for architecture x86_64:'. I have checked multiple questions on this subject and all had essentially nothing to do with my case. I am on OSX 10.11.6 and I have used macports to install boost, and gcc6. I have set everything up so I actually use gcc and g++ instead of clang. This is why I don't believe my problem is related to this one 因为我使用的是实际的 g++,如果我的理解正确的话,我不应该处理这个 libstc++ 和 libc++ 问题。我所有来自 macports 的包和 macports 本身都是最新的。有人愿意分享一些见解吗?

当我 运行 创建 .so 的命令时:(我相信我一定在 Boost 的库中遗漏了一些 link,但我不知道它是什么)

g++ -shared -o hello.so -fPIC hello.cpp `python-config --cflags --libs` -lboost_python

我收到一点警告和一条简短的错误消息,但 hello.so.dSYM 文件已创建并保存在目录中:

cc1plus: warning: command line option '-Wstrict-prototypes' is valid for C/ObjC but not for C++

Undefined symbols for architecture x86_64: "boost::python::objects::function_object(boost::python::objects::py_function const&, std::pair const&)", referenced from:

    init_module_hello()     in cchDzx8t.o

"boost::python::objects::register_dynamic_id_aux(boost::python::type_info, std::pair ()(void))", referenced from:

    init_module_hello()     in cchDzx8t.o

ld: symbol(s) not found for architecture x86_64

collect2: error: ld returned 1 exit status

我的 .cpp 代码与该教程中显示的完全相同:

#include <boost/python.hpp>
using namespace boost::python;
struct World {   
    void set(std::string msg) { this->msg = msg; }
         std::string greet() { return msg; }
         std::string msg;
};
BOOST_PYTHON_MODULE(hello)
{
    class_<World>("World")
    .def("greet", &World::greet)
    .def("set", &World::set)
    ;   
}

无论您是否正确安装了 GCC/G++,MacPorts 总是在 clang 将默认使用 libc++ 编译的系统上针对 libc++ 构建其 C++ 软件。

这意味着您的 MacPorts 版本的 Boost 是使用 libc++ 编译的,这意味着您不能将它与 GCC/G++ 一起使用(除非您跳过一些额外的环节以将 libc++ 与 GCC 一起使用)。

尽管您猜测您的问题不是您在链接的其他 post 中描述的问题,但确实如此。您的选择是:

  • 使用 clang++
  • 使用 g++ 构建您自己的 Boost 副本