CMake Boost 链接问题
CMake Boost linking problems
我正在使用 Boost::Python
和 Boost::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
是 header-only 库,所以我只添加了 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.
导入模块
最后还是自己找到了解决办法。问题确实是 Boost::Python
没有正确构建。我完全不知道这是一个错误还是我自己的错,但就我而言,仅仅编辑 Boost Build's user-config.jam
以使用 python3.5 是不够的:运行 构建脚本导致 libboost_python3.so
,但在内部使用了 python2.7 解释器,原因我不知道。
所以,我所做的是启动 Boost 初始引导作为 ./bootstrap.sh --with-python=/usr/bin/python3.5m
,即将绝对路径指向所需的解释器。重建 Boost::Python
后,所有符号都已成功解析。
我正在使用 Boost::Python
和 Boost::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
是 header-only 库,所以我只添加了 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.
最后还是自己找到了解决办法。问题确实是 Boost::Python
没有正确构建。我完全不知道这是一个错误还是我自己的错,但就我而言,仅仅编辑 Boost Build's user-config.jam
以使用 python3.5 是不够的:运行 构建脚本导致 libboost_python3.so
,但在内部使用了 python2.7 解释器,原因我不知道。
所以,我所做的是启动 Boost 初始引导作为 ./bootstrap.sh --with-python=/usr/bin/python3.5m
,即将绝对路径指向所需的解释器。重建 Boost::Python
后,所有符号都已成功解析。