¿Cómo debería verse mi archivo CMake para vincular mi programa con la biblioteca 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 <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;
}
Me las he arreglado para hacer eso. Las únicas líneas que agregué a mis archivos CMake fueron:
target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)
target_link_libraries
después de las líneasadd_executable
yfind_package
, para que se conozcan todos los componentes vinculados.La siguiente es mi configuración:
fuente
Adaptando la respuesta @MOnsDaR para la sintaxis de CMake moderna con destinos importados, esto sería:
Tenga en cuenta que no es necesario especificar los directorios de inclusión manualmente, ya que ya se realiza a través del destino importado
Boost::program_options
.fuente
The FindBoost.cmake
originalmente los compila solo si enumera explícitamente su versión de Boost. En algún momento se suponía que esto iba a mejorar, pero sigo viendo fallas con CMake 3.10.2 y Boost 1.66 (copias más recientes de brew).¿Qué biblioteca de Boost? Muchos de ellos son plantillas puras y no requieren vinculación.
Ahora, con ese ejemplo concreto que realmente se muestra que nos dice que desea las opciones del programa Boost (y aún más nos dice que está en Ubuntu), debe hacer dos cosas:
libboost-program-options-dev
para que pueda vincularlo.cmake
que se vincule contralibboost_program_options
.Principalmente uso Makefiles, así que aquí está el uso directo de la línea de comandos:
Parece que no hace mucho.
Para CMake, debe agregar boost_program_options a la lista de bibliotecas, y IIRC esto se hace a través
SET(liblist boost_program_options)
de suCMakeLists.txt
.fuente
De dos formas, utilizando la ruta de instalación predeterminada del sistema, normalmente
/usr/lib/x86_64-linux-gnu/
:Si instala Boost en un directorio local o elige la instalación local en lugar de la instalación del sistema, puede hacerlo así:
Tenga en cuenta que el directorio anterior
/home/xy/boost_install/lib/
es donde instalo Boost:Si está interesado en cómo usar un Boost instalado localmente, puede ver esta pregunta ¿Cómo puedo hacer que CMake encuentre mi instalación Boost alternativa? .
fuente
Aquí está mi opinión:
fuente
find_package(Boost QUIET REQUIRED)
y enlace a su destino (DB32):target_link_libraries(DB32 PUBLIC Boost::headers)