Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake-Boost链接问题_C++_Boost_Cmake_Boost Asio_Boost Python - Fatal编程技术网

C++ CMake-Boost链接问题

C++ CMake-Boost链接问题,c++,boost,cmake,boost-asio,boost-python,C++,Boost,Cmake,Boost Asio,Boost Python,我正在使用Boost::Python和Boost::Asio编写我的源代码,然后编写CMakeLists.txt,从类似的源代码(文件的一部分)创建我自己的共享库: (因为Boost::Asio是我刚刚添加的唯一头库系统线程regex,因为我发现它依赖于它)。因此,CMake结果看起来是正确的: --Boost版本:1.65.0 --找到以下Boost库: --蟒蛇 --系统 --线 --正则表达式 --计时 --日期和时间 --原子的 --配置完成 --生成完成 (但为什么要搜索chrono等

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

(因为
Boost::Asio
是我刚刚添加的唯一头库
系统线程regex
,因为我发现它依赖于它)。因此,CMake结果看起来是正确的:

--Boost版本:1.65.0
--找到以下Boost库:
--蟒蛇
--系统
--线
--正则表达式
--计时
--日期和时间
--原子的
--配置完成
--生成完成

(但为什么要搜索chrono等?其他依赖项?) 嗯,当我运行
make my_lib
时,在函数PyInit\u my_lib中有一些链接器错误,比如:
:对boost::python::detail::init_模块的未定义引用(PyModuleDef&,void(*))
和函数boost::asio::detail::posix_thread:~posix_thread(): /usr/local/include/boost/asio/detail/impl/posix_thread.ipp:35:未定义对pthread_detach的引用 ,因此Boost没有正确链接。 我读了很多文档和类似的问题,但不明白我做错了什么


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

最后,我自己找到了解决方案。问题确实是
Boost::Python
没有正确构建。我不完全知道这是一个bug还是我自己的错,但在我的例子中,仅仅编辑
Boost Build的user config.jam
来使用python3.5是不够的:运行构建脚本导致
libboost\u python3.so
,但它内部使用python2.7解释器的原因我不知道


因此,我所做的是启动Boost initial bootstrapping作为
/bootstrap.sh——使用python=/usr/bin/python3.5m
,即指向所需解释器的绝对路径。重建
Boost::Python
后,成功解析了所有符号

首先,在find\u包调用之前,需要设置
set(Boost\u USE\u STATIC\u LIBS OFF)set(Boost\u USE\u multi threaded ON)
。第二,您应该在目标链接库调用中切换库的顺序:Phython库先运行,然后是Boost库。@vre完成,但没有帮助:(应用更改后是否删除了
cmakache.txt
?有时是必要的,否则您的更改将不会应用。@vre是的,没有任何更改,您可能需要在调用find\u package之前指定
set(Boost\u附加版本“1.65”“1.65.0”)
`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})`