2017-06-22 59 views
0

我想用cmake来构建一个简单的解析器项目。我在我的代码中使用了boost :: program_options,但似乎cmake没有查找boost lib目录。感到困惑和沮丧..cmake无法查找外部库(boost)目录

我的CMakeLists.txt是

# basic info 
CMAKE_MINIMUM_REQUIRED(VERSION 3.1.0) 
PROJECT(parser CXX) 
SET(CMAKE_CXX_STANDARD 14) 

# Boost 
FIND_PACKAGE(Boost 1.61.0 REQUIRED PATHS /path/to/boost NO_DEFAULT_PATH) 
MESSAGE(STATUS "Boost version: ${Boost_VERSION}") 
MESSAGE(STATUS "Boost include dirs: ${Boost_INCLUDE_DIRS}") 
MESSAGE(STATUS "Boost library dirs: ${Boost_LIBRARY_DIRS}") 
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) 
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) 

# main 
FILE(GLOB main_SRC *.cpp) 
ADD_EXECUTABLE(main ${main_SRC}) 
TARGET_LINK_LIBRARIES(main boost_program_options) 

我使用修改后的BoostConfig.cmake(这点我自己的Boost库)

运行CD生成结果; cmake的..

-- Boost version: 1.61.0 
-- Boost include dirs: /path/to/boost/include 
-- Boost library dirs: /path/to/boost/lib 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /path/to/build 

因此我相信cmake的找到了我的Boost库。不过,如果我跑使我将结束与一堆错误像

undefined reference to `boost::program_options ... ` 

如果我运行使VERBOSE = 1我会看到

/path/to/g++ -rdynamic CMakeFiles/main.dir/main.cpp.o -o main -lboost_program_options 

的命令没有 - L或-Wl,rpath为$ {Boost_LIBRARY_DIRS}。如果我手动添加标志,那么我可以成功编译项目。

我也试图通过TARGET_LINK_LIBRARIES(主要$ {} Boost_LIBRARY_DIR /libboost_program_options.a)的代替LINK_DIRECTORIES()链接到静态库,但被抛出同样的错误。

不知道是什么让事情错了.. 预先感谢

+0

仅供参考我使用的cmake 3.8.0和g ++ 7.1.0 .. –

+0

随着CMake的,你不应该明确链接库,而是使用模块提供的目标来代替。另见:[CMake-FindBoost](https://cmake.org/cmake/help/latest/module/FindBoost.html) – Drop

回答

0

用进口指标的标准方法,会发生什么?也就是说,

# Use and set variable/-Dflag/environment for custom Boost location 
set(BOOST_ROOT /path/to/boost) 
find_package(Boost 1.61.0 REQUIRED 
    COMPONENTS program_options) 
add_executable(main ...) 
target_link_libraries(main Boost::program_options)