【问题标题】:CMake boost also needs -lboost_* to workCMake boost 还需要 -lboost_* 才能工作
【发布时间】: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
  • 您遇到什么错误,缺少哪个库?还尝试启用详细链接并查看那里指定了哪些库

标签: python c++ boost cmake


【解决方案1】:

FindBoost doc中所述

target_link_libraries(${EXEC_NAME} ${Boost_LIBRARIES})

需要使用,去掉

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

查看Boost_LIBRARIES变量的内容:

 message( "Boost_LIBRARIES: ${Boost_LIBRARIES}" )

您可以尝试改用Boost_python_LIBRARY 变量,Boost_python_LIBRARY_DEBUGBoost_python_LIBRARY_RELEASE 也可以工作,在这种情况下,您的 boost 安装很可能以某种方式损坏,或者至少不是 cmake 模块所期望的方式。

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

set( Boost_USE_MULTITHREADED OFF )

set( Boost_USE_STATIC_LIBS ON )

find_package 之前或查找导致该链接错误的原因。

【讨论】:

  • 我已经说过只使用target_link_libraries 对我不起作用。这就是我添加CMAKE_xxx_FLAGS的原因。
  • 在哪种特殊情况下它不起作用?很可能你在target_link_libraries 某处使用了错误的变量
  • 我的代码中有与target_link_libraries(${EXEC_NAME} ${Boost_LIBRARIES}) 完全相同的行。如果我删除它下面的两行,我会得到错误。
  • 感谢您的回答。我再次更新了我的问题以反映您的建议。
  • @Ashkan 不幸的是,有许多移动部件,当您指定 -lboost_python 与 -lboost_python-mt 等时,您需要检查链接了哪个库。看起来您的系统上安装了不同的 boost 库,并且您编译和链接不同的库。
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2015-07-19
  • 2013-12-28
  • 1970-01-01
相关资源
最近更新 更多