Cómo vincular el progtwig C ++ con Boost usando CMake

¿Cómo debería ser mi archivo CMake para vincular mi progtwig con la biblioteca de Boost en Ubuntu?

Los errores que se muestran durante la ejecución make :

 main.cpp:(.text+0x3b): undefined reference to `boost::program_options::options_description::m_default_line_length' 

El archivo principal es realmente simple:

 #include  #include  using namespace std; #include  namespace po = boost::program_options; int main(int argc, char** argv) { po::options_description desc("Allowed options"); desc.add_options() ("help", "produce help message") ; return 0; } 

He logrado hacer eso. Las únicas líneas que he agregado a mis archivos CMake fueron:

 target_link_libraries( my_target_file ${Boost_PROGRAM_OPTIONS_LIBRARY} ) 

En CMake puedes usar find_package para encontrar las bibliotecas que necesitas. Usualmente hay un FindBoost.cmake junto con la instalación de CMake.

Por lo que recuerdo, se instalará en /usr/share/cmake/Modules/ junto con otros find-scripts para bibliotecas comunes. Puede consultar la documentación en ese archivo para obtener más información sobre cómo funciona.

Un ejemplo fuera de mi cabeza:

 FIND_PACKAGE( Boost 1.40 COMPONENTS program_options REQUIRED ) INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} ) ADD_EXECUTABLE( anyExecutable myMain.cpp ) TARGET_LINK_LIBRARIES( anyExecutable LINK_PUBLIC ${Boost_LIBRARIES} ) 

Espero que este código ayude.

  • Aquí está la documentación oficial sobre FindBoost.cmake .
  • Y el FindBoost.cmake real (alojado en GitHub)

La siguiente es mi configuración:

 cmake_minimum_required(VERSION 2.8) set(Boost_INCLUDE_DIR /usr/local/src/boost_1_46_1) set(Boost_LIBRARY_DIR /usr/local/src/boost_1_46_1/stage/lib) find_package(Boost COMPONENTS system filesystem REQUIRED) include_directories(${Boost_INCLUDE_DIR}) link_directories(${Boost_LIBRARY_DIR}) add_executable(main main.cpp) target_link_libraries( main ${Boost_LIBRARIES} ) 

Adaptando la respuesta @MOnsDaR para la syntax CMake moderna con objectives importados, esto sería:

 find_package(Boost 1.40 COMPONENTS program_options REQUIRED) add_executable(anyExecutable myMain.cpp) target_link_libraries(anyExecutable Boost::program_options) 

Tenga en cuenta que no es necesario especificar los directorios de inclusión de forma manual, ya que ya se ha solucionado a través del objective importado Boost::program_options .

¿Qué biblioteca de Boost? Muchos de ellos son plantillas puras y no requieren enlaces.

Ahora que muestra un ejemplo concreto que nos dice que desea las opciones del progtwig Boost (y aún más nos dijo que está en Ubuntu), debe hacer dos cosas:

  1. Instala libboost-program-options-dev para que puedas vincularlo.
  2. Dile a cmake que se vincule con libboost_program_options .

Uso principalmente Makefiles así que aquí está el uso directo de la línea de comandos:

 $ g++ boost_program_options_ex1.cpp -o bpo_ex1 -lboost_program_options $ ./bpo_ex1 $ ./bpo_ex1 -h $ ./bpo_ex1 --help $ ./bpo_ex1 -help $ 

No hace mucho, parece.

Para CMake, necesita agregar boost_program_options a la lista de bibliotecas, y IIRC esto se hace a través de SET(liblist boost_program_options) en su CMakeLists.txt .

De dos maneras, usando la ruta de instalación predeterminada del sistema, generalmente /usr/lib/x86_64-linux-gnu/ :

 find_package(Boost REQUIRED regex date_time system filesystem thread graph) include_directories(${BOOST_INCLUDE_DIRS}) message("boost lib: ${Boost_LIBRARIES}") message("boost inc:${Boost_INCLUDE_DIR}") add_executable(use_boost use_boost.cpp) target_link_libraries(use_boost ${Boost_LIBRARIES} ) 

Si instala Boost en un directorio local o elige la instalación local en lugar de la instalación del sistema, puede hacerlo de esta manera:

 set( BOOST_ROOT "/home/xy/boost_install/lib/" CACHE PATH "Boost library path" ) set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" ) find_package(Boost REQUIRED regex date_time system filesystem thread graph) include_directories(${BOOST_INCLUDE_DIRS}) message("boost lib: ${Boost_LIBRARIES}, inc:${Boost_INCLUDE_DIR}") add_executable(use_boost use_boost.cpp) target_link_libraries(use_boost ${Boost_LIBRARIES} ) 

Tenga en cuenta que dir /home/xy/boost_install/lib/ es donde instalo Boost:

 xy@xy:~/boost_install/lib$ ll -th total 16K drwxrwxr-x 2 xy xy 4.0K May 28 19:23 lib/ drwxrwxr-x 3 xy xy 4.0K May 28 19:22 include/ xy@xy:~/boost_install/lib$ ll -th lib/ total 57M drwxrwxr-x 2 xy xy 4.0K May 28 19:23 ./ -rw-rw-r-- 1 xy xy 2.3M May 28 19:23 libboost_test_exec_monitor.a -rw-rw-r-- 1 xy xy 2.2M May 28 19:23 libboost_unit_test_framework.a ....... xy@xy:~/boost_install/lib$ ll -th include/ total 20K drwxrwxr-x 110 xy xy 12K May 28 19:22 boost/ 

Si está interesado en cómo usar un Boost instalado localmente, puede ver esta pregunta. ¿Cómo puedo obtener CMake para encontrar mi instalación alternativa de Boost? .