【发布时间】:2017-09-15 13:29:32
【问题描述】:
我正在使用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 是仅标头库,我只添加了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 没有正确链接。
我已经阅读了很多文档和类似的问题,但无法理解我做错了什么。
附:当我禁用-Wl,--no-undefined链接器选项时,链接成功,但未定义的引用仍然存在,我无法使用python导入模块。
【问题讨论】:
-
首先您需要在调用 find_package 之前设置
set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_MULTITHREADED ON)。其次,您应该在 target_link_libraries 调用中切换库的顺序:首先是 Phython 库,然后是 Boost 库。 -
@vre 完成,但没有帮助:(
-
您是否在应用更改后删除了
CMakeCache.txt?有时这是必要的,否则您的更改将不适用。 -
@vre 是的,没有任何改变
-
您可能需要在调用 find_package 之前指定
set(Boost_ADDITIONAL_VERSIONS "1.65" "1.65.0")。
标签: c++ boost cmake boost-asio boost-python