CMake Boost链接问题

时间:2017-09-15 13:29:33

标签: c++ boost cmake boost-asio boost-python

我正在使用Boost::PythonBoost::Asio编写我的源代码,然后编写CMakeLists.txt从这样的来源(文件的一部分)创建我自己的共享库:

`find_package(Boost REQUIRED COMPONENTS python system thread regex)
if (Boost_FOUND)
    set(Boost_USE_STATIC_LIBS     OFF)
    set(Boost_USE_MULTITHREADED    ON)
    include_directories(${Boost_INCLUDE_DIRS})
    link_directories(${Boost_LIBRARY_DIRS})
endif()
find_package(PythonLibs 3 REQUIRED)
find_package(PythonInterp 3 REQUIRED)
if (PYTHONLIBS_FOUND)
    include_directories(${PYTHON_INCLUDE_DIRS})
    link_directories(${PYTHON_LIBRARIES})
endif()
add_library(my_lib SHARED ${MY_SOURCES})
set_target_properties(my_lib PROPERTIES PREFIX "" SUFFIX ".pyd")
target_link_libraries(my_lib ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})`

(由于Boost::Asio是仅限标题的库,我添加了system thread regex,因为我发现它取决于它)。所以CMake结果看起来是正确的:

-- Boost version: 1.65.0 -- Found the following Boost libraries: -- python -- system -- thread -- regex -- chrono -- date_time -- atomic -- Configuring done -- Generating done

(但为什么要搜索chrono等?附加依赖?) 好吧,当我正在运行make my_lib时,会出现一些链接器错误:In function PyInit_my_lib: undefined reference to boost::python::detail::init_module(PyModuleDef&, void (*)())In function boost::asio::detail::posix_thread::~posix_thread(): /usr/local/include/boost/asio/detail/impl/posix_thread.ipp:35: undefined reference to pthread_detach ,所以Boost没有正确联系。 我已经阅读了很多文档和类似的问题,但无法理解我做错了什么。

P.S。当我禁用-Wl,--no-undefined链接器选项时,链接成功,但未定义的引用仍然存在,我无法使用python导入模块。

1 个答案:

答案 0 :(得分:1)

最后,我自己找到了解决方案。问题确实是Boost::Python未正确构建。我完全不知道它是一个错误还是我自己的错,但在我的情况下,仅使用python3.5编辑Boost Build's user-config.jam是不够的:运行构建脚本导致libboost_python3.so,但内部python2 .7使用翻译是因为我不知道的原因。

所以,我所做的是将{Boost}初始引导作为./bootstrap.sh --with-python=/usr/bin/python3.5m启动,即指向所需解释器的绝对路径。重建Boost::Python后,所有符号都已成功解析。