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)