2010-10-09 21 views
74

¿Cómo debería ser mi archivo cmake para vincular mi programa con la biblioteca de impulso en Ubuntu?Cómo vincular el programa C++ con Boost usando CMake

Los errores muestran durante el que la ejecución de:

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

El archivo principal es muy simple:

#include <boost/program_options/options_description.hpp> 
#include <boost/program_options/option.hpp> 
using namespace std; 
#include <iostream> 

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 conseguido hacer eso, las únicas líneas que he añadido a mis archivos cmake fueron:

target_link_libraries(
my_target_file 
${Boost_PROGRAM_OPTIONS_LIBRARY} 
) 

Respuesta

111

En CMake puede usar find_package para encontrar las bibliotecas que necesita. Generalmente hay un FindBoost.cmake junto con su CMake-Installation.

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

no estoy en el trabajo ahora, por lo que sólo podría proporcionar un ejemplo de la 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}) 

Esperanza este código ayuda.

+1

Se ha agregado un enlace de trabajo desde el repositorio de Kitwares Github. También se agregó un enlace a la documentación oficial sobre FindBoost.cmake – MOnsDaR

+1

¿Por qué Boost 1.40 en particular? ¿Cuándo dejaron de cambiar las funcionalidades básicas de la biblioteca? – jgyou

+4

Porque ¿por qué no? Es sólo un ejemplo ... Rellena lo que mejor se adapte a – MOnsDaR

5

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

Editar Ahora que realmente mostró ejemplo concreto que nos dice que desea impulsar las opciones del programa (y más aún nos dijo que son en Ubuntu), que tiene que hacer dos cosas:

  1. instalar libboost-program-options-dev de manera que se puede vincular en contra de ella
  2. cmake dicen a enlazar con libboost_program_options

yo sobre todo utilizar Makefile así que aquí es el mandamiento directa uso de línea:

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

Parece que no hace mucho.

Para CMake, necesita agregar boost_program_options a la lista de bibliotecas, IIRC esto se hace a través de .

+10

Su consejo CMake es incorrecta (ver la respuesta aceptada), y su consejo de comandos no es muy útil ya que la pregunta era sobre CMake. – Ela782

43

La siguiente es la configuración de mi:

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}) 
+5

No se requieren los link_directories ya que Boost_LIBRARIES serán rutas totalmente calificadas. – RobertJMaynard

5

Adaptación respuesta @MOnsDaR para la sintaxis CMake moderna con objetivos 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) 

en cuenta que no es necesario especificar los directorios incluyen de forma manual, puesto que ya es atendido a través del alquitrán importados obtener Boost::program_options.

+0

La desventaja de este enfoque objetivo es que si su versión de Boost es más nueva que su versión de CMake, probablemente falle. 'FindBoost.cmake' originalmente construye estos solo si lista explícitamente su versión de Boost. En algún momento, se suponía que debía mejorarse, pero sigo viendo fallas con CMake 3.10.2 y Boost 1.66 (las copias más recientes de brew). –

Cuestiones relacionadas