Wie soll meine CMake-Datei aussehen, um mein Programm mit der Boost-Bibliothek unter Ubuntu zu verknüpfen?
Die beim Ausführen von make
angezeigten Fehler:
main.cpp:(.text+0x3b): undefined reference to `boost::program_options::options_description::m_default_line_length'
Die Hauptdatei ist wirklich einfach:
#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;
}
Das habe ich geschafft. Die einzigen Zeilen, die ich zu meinen CMake-Dateien hinzugefügt habe, waren:
target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)
In CMake können Sie find_package
, um die benötigten Bibliotheken zu finden. Es ist in der Regel ein FindBoost.cmake
zusammen mit Ihrer CMake-Installation.
Soweit ich mich erinnere, wird es installiert, um /usr/share/cmake/Modules/
zusammen mit anderen Suchskripten für allgemeine Bibliotheken. Sie können einfach die Dokumentation in dieser Datei überprüfen, um weitere Informationen zur Funktionsweise zu erhalten.
Ein Beispiel aus meinem Kopf:
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} )
Ich hoffe dieser Code hilft.
Folgendes ist meine Konfiguration:
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} )
Anpassen der @ MOnsDaR-Antwort an die moderne CMake-Syntax mit importierten Zielen:
find_package(Boost 1.40 COMPONENTS program_options REQUIRED)
add_executable(anyExecutable myMain.cpp)
target_link_libraries(anyExecutable Boost::program_options)
Beachten Sie, dass die Include-Verzeichnisse nicht manuell angegeben werden müssen, da dies bereits über das importierte Ziel Boost::program_options
Erledigt wird.
Welche Boost-Bibliothek? Viele von ihnen sind reine Vorlagen und erfordern keine Verknüpfung.
Mit dem tatsächlich gezeigten konkreten Beispiel, das uns sagt, dass Sie Boost-Programmoptionen möchten (und noch mehr, dass Sie auf Ubuntu sind), müssen Sie zwei Dinge tun:
libboost-program-options-dev
, Damit Sie eine Verknüpfung herstellen können.cmake
, dass der Link gegen libboost_program_options
Erstellt werden soll.Ich benutze meistens Makefiles, daher hier die direkte Kommandozeilenverwendung:
$ g++ boost_program_options_ex1.cpp -o bpo_ex1 -lboost_program_options
$ ./bpo_ex1
$ ./bpo_ex1 -h
$ ./bpo_ex1 --help
$ ./bpo_ex1 -help
$
Es macht nicht viel, wie es scheint.
Für CMake müssen Sie boost_program_options zur Liste der Bibliotheken hinzufügen, und IIRC erledigt dies über SET(liblist boost_program_options)
in Ihrem CMakeLists.txt
.
Zwei Möglichkeiten, den Standardinstallationspfad des Systems zu verwenden, normalerweise /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}
)
Wenn Sie Boost in einem lokalen Verzeichnis installieren oder die lokale Installation anstelle der Systeminstallation auswählen, können Sie dies folgendermaßen tun:
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}
)
Beachten Sie das obige Verzeichnis /home/xy/boost_install/lib/
ist, wo ich Boost installiere:
[email protected]:~/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/
[email protected]:~/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
.......
[email protected]:~/boost_install/lib$ ll -th include/
total 20K
drwxrwxr-x 110 xy xy 12K May 28 19:22 boost/
Wenn Sie daran interessiert sind, einen lokal installierten Boost zu verwenden, können Sie diese Frage sehen Wie kann ich CMake dazu bringen, meine alternative Boost-Installation zu finden?.