Python CMake boost还需要-lboost才能工作

Python CMake boost还需要-lboost才能工作,python,c++,boost,cmake,Python,C++,Boost,Cmake,我试图将我的代码链接到boost、python和armadillo。这是我使用的CMakeLists.txt cmake_minimum_required(VERSION 3.3) set(EXEC_NAME phases) set(LIBS_NAME Hamilton) project(${EXEC_NAME}) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif() set(CMAKE_CXX_FLAGS "

我试图将我的代码链接到boost、python和armadillo。这是我使用的CMakeLists.txt

cmake_minimum_required(VERSION 3.3)

set(EXEC_NAME phases)
set(LIBS_NAME Hamilton)
project(${EXEC_NAME})

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release")
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(LIB_HEADER point.h
               hamilton.h)
set(LIB_SOURCE  point.cpp
               hamilton.cpp)

add_library(${LIBS_NAME} SHARED ${LIB_SOURCE} ${LIB_HEADER})
add_library("${LIBS_NAME}_mod" MODULE ${LIB_SOURCE} ${LIB_HEADER})

set(HEADER_FILES point.h hamilton.h)
set(SOURCE_FILES main.cpp)
add_executable(${EXEC_NAME} ${SOURCE_FILES} ${HEADER_FILES})
target_link_libraries(${EXEC_NAME} ${LIBS_NAME})

find_package(Boost COMPONENTS python REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(${EXEC_NAME} ${Boost_LIBRARIES})
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lboost_python")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lboost_python")

find_package(Armadillo REQUIRED)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -larmadillo")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -larmadillo")
include_directories(${ARMADILLO_INCLUDE_DIRS})
target_link_libraries(${EXEC_NAME} ${ARMADILLO_LIBRARIES})

find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
target_link_libraries(${EXEC_NAME} ${PYTHON_LIBRARIES})
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lpython")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lpython")

message(STATUS "Building in ${CMAKE_BUILD_TYPE} ...")
如您所见,我在每个库后面添加了标志
-l..
。如果删除它们,则会出现链接器错误

有什么好办法可以避免这种情况吗

我使用英特尔编译器icc,但也尝试使用clang和gcc clang不需要额外的
-l..
标志

注意 仅使用
target\u link\u库
而不使用
CMAKE\u xxx\u标志
会导致链接器错误。这就是我问这个问题的原因

我使用自制软件安装了cmake 3.3、boost 1.59以及boost python和armadillo

更新

我得到的错误是

Reaping winning child 0x7fa188492f80 PID 47863 
Live child 0x7fa188492f80 (libHamilton.dylib) PID 47864 
Undefined symbols for architecture x86_64:
  "__ZN5boost6python15instance_holder10deallocateEP7_objectPv", referenced from:  
__ZN5boost6python7objects11make_holderILi3EE5applyINS1_12value_holderI8Hami    ltonEENS_3mpl7vector3IKdKmSB_EEE7executeEP7_objectdmm in hamilton.cpp.o
这是从链接到boost库

输出
Boost_库的内容给了我

/usr/local/lib/libboost_python-mt.dylib
另一方面,
Boost\u python\u库
返回空字符串

,如中所述

需要使用,请删除

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lboost_python")

检查
Boost_库的内容
变量:

 message( "Boost_LIBRARIES: ${Boost_LIBRARIES}" )
您可以尝试使用
Boost\u python\u LIBRARY
变量,也可以使用
Boost\u python\u LIBRARY\u DEBUG
Boost\u python\u LIBRARY\u RELEASE
进行调试,在这种情况下,您的Boost安装很可能以某种方式被破坏,或者至少不是cmake模块所期望的方式

更新:您的错误表明您在链接多线程或共享版本的boost_python时遇到问题。您可以通过指定以下内容来修复它:

set( Boost_USE_MULTITHREADED OFF )


查找\u程序包之前
或查找链接错误的原因。

您使用的是什么版本的cmake?我已使用HomeBrew安装了cmake 3.3。您遇到了什么错误,缺少哪个库?另外,请尝试启用详细链接并查看其中指定了哪些库。我已经说过,仅使用
target\u link\u库对我不起作用。这就是为什么我添加了
CMAKE\u xxx\u标志
。在哪种情况下它不起作用?很可能您在
target\u link\u库
中使用了错误的变量,我在代码中的行与
target\u link\u库(${EXEC\u NAME}${Boost\u libraries})
完全相同。如果我去掉下面的两行,我会得到错误。谢谢你的回答。我再次更新了我的问题以反映您的建议。@Ashkan不幸的是,有很多移动部件是可以链接的,当您指定-lboost\u python vs-lboost\u python-mt等时,您需要检查链接了哪个库。看起来您的系统上安装了不同的boost库,您可以编译并链接不同的库。
set( Boost_USE_MULTITHREADED OFF )
set( Boost_USE_STATIC_LIBS ON )