【发布时间】:2015-12-02 15:02:01
【问题描述】:
我正在尝试将我的代码链接到 boost、python 和犰狳。这是我使用的 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... 标志。如果我删除它们,我会收到链接器错误。
有什么好的方法可以避免这种情况吗?
我使用 intel 编译器 icc 但也尝试过 clang 和 gcc
clang 不需要额外的 -l... 标志。
注意
仅使用 target_link_libraries 而不使用 CMAKE_xxx_flags 会给我一个链接器错误。这就是我问这个问题的原因。
我有 cmake 3.3,boost 1.59,使用自制软件安装了 boost-python 和犰狳
更新
我得到的错误是
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_LIBRARIES的内容给我
/usr/local/lib/libboost_python-mt.dylib
另一方面,Boost_python_LIBRARY 返回空字符串
【问题讨论】:
-
你用什么版本的cmake?
-
我使用自制软件安装了 cmake 3.3
-
您遇到什么错误,缺少哪个库?还尝试启用详细链接并查看那里指定了哪些库