首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake boost还需要-lboost_*才能工作

CMake boost还需要-lboost_*才能工作
EN

Stack Overflow用户
提问于 2015-12-02 15:02:01
回答 1查看 321关注 0票数 0

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

代码语言:javascript
复制
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_link_libraries而不使用CMAKE_xxx_flags,这给了我一个链接器错误。所以我才问这个问题。

我有cmake 3.3,boost 1.59,boost-python和armadillo使用自制安装

更新

我得到的错误是

代码语言:javascript
复制
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的内容给我

代码语言:javascript
复制
/usr/local/lib/libboost_python-mt.dylib

另一方面,Boost_python_LIBRARY返回空字符串

EN

回答 1

Stack Overflow用户

发布于 2015-12-02 15:11:10

FindBoost文档中所述

代码语言:javascript
复制
target_link_libraries(${EXEC_NAME} ${Boost_LIBRARIES})

需要使用,移除

代码语言:javascript
复制
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lboost_python")

检查Boost_LIBRARIES变量的内容:

代码语言:javascript
复制
 message( "Boost_LIBRARIES: ${Boost_LIBRARIES}" )

您可以尝试使用Boost_python_LIBRARY变量,也可以使用Boost_python_LIBRARY_DEBUGBoost_python_LIBRARY_RELEASE,在这种情况下,很可能您的boost安装失败了,或者至少不像cmake模块所期望的那样。

更新:您的错误显示您有问题链接多线程或共享版本的boost_python。您可以通过指定:

代码语言:javascript
复制
set( Boost_USE_MULTITHREADED OFF )

代码语言:javascript
复制
set( Boost_USE_STATIC_LIBS ON )

find_package之前或找到该链接错误的原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34045936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档