/ / cmake no busca el directorio de la biblioteca externa (boost) - c ++, boost, cmake

cmake no busca el directorio de la biblioteca externa (boost) - c ++, boost, cmake

Estoy tratando de usar cmake para construir un proyecto de analizador simple. Utilicé boost :: program_options en mi código, pero parece que cmake no busca el directorio boost lib. Confundirse y frustrarse ..

Mi CMakeLists.txt es

# 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)

Uso un BoostConfig.cmake modificado (que apunta a mi propia biblioteca de Boost)

El resultado para correr cd build; cmake .. es

-- 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

Por lo tanto, creo que cmake ha encontrado mi biblioteca Boost. Pero entonces si corro hacer Voy a terminar con un montón de errores como

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

Si corro hacer VERBOSE = 1 yo veré

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

el comando no tiene -L o -Wl, rpath para $ {Boost_LIBRARY_DIRS}. Si agrego la bandera manualmente, entonces puedo compilar el proyecto exitosamente.

También traté de enlazar a estática lib por TARGET_LINK_LIBRARIES (main $ {Boost_LIBRARY_DIR} /libboost_program_options.a) en lugar de LINK_DIRECTORIES (), pero el mismo error fue lanzado.

No estoy seguro de lo que hace las cosas mal ... Gracias por adelantado

Respuestas

0 para la respuesta № 1

¿Qué pasa con el método estándar usando los objetivos importados? Es decir,

# 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)