Cómo vincular el programa C++ con Boost usando CMake
(4)
¿Cómo debería ser mi archivo cmake para vincular mi programa con la biblioteca de impulso bajo Ubuntu?
Los errores se muestran durante la ejecución de make:
main.cpp:(.text+0x3b): undefined reference to `boost::program_options::options_description::m_default_line_length''
El archivo principal es realmente 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;
}
Logré hacer eso, las únicas líneas que agregué a mis archivos cmake fueron:
target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)
¿Qué biblioteca de Boost? Muchos de ellos son plantillas puras y no requieren enlaces.
Edite Ahora que en realidad mostró un ejemplo concreto que nos dice que desea las opciones del programa Boost (y aún más nos dijo que está en Ubuntu), debe hacer dos cosas:
- instala
libboost-program-options-dev
para que puedas vincularlo - dile a
cmake
que se vincule conlibboost_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, IIRC esto se hace a través de SET(liblist boost_program_options)
en su CMakeLists.txt
.
Adaptando la 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)
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 objetivo importado Boost::program_options
.
En CMake puedes usar find_package
para encontrar las bibliotecas que necesitas. Usualmente hay un FindBoost.cmake
junto con su CMake-Installation.
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.
No estoy trabajando ahora, así que podría dar un ejemplo 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} )