So verknüpfen Sie das C ++ - Programm mit Boost mithilfe von CMake


109

Wie sollte meine CMake-Datei aussehen, um mein Programm mit der Boost-Bibliothek unter Ubuntu zu verknüpfen?

Die beim Ausführen angezeigten Fehler make:

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 meinen CMake-Dateien hinzugefügt habe, waren:

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)

Antworten:


150

In CMake können Sie find_packageBibliotheken finden, die Sie benötigen. Es gibt normalerweise eineFindBoost.cmake zusammen mit Ihrer CMake-Installation.

Soweit ich mich erinnere, wird es /usr/share/cmake/Modules/zusammen mit anderen Suchskripten für allgemeine Bibliotheken installiert . 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.


2
Ein funktionierender Link von Kitwares Github Repo wurde hinzugefügt. Außerdem wurde ein Link zur offiziellen Dokumentation über FindBoost.cmake
MOnsDaR vom

1
Warum gerade Boost 1.40? Wann haben sich die Basisfunktionalitäten der Bibliothek nicht mehr geändert?
Jgyou

6
Weil warum nicht? Es ist nur ein Beispiel ... Füllen Sie aus, was am besten zu Ihnen passt
MOnsDaR

5
Ein wichtiges Detail ist das Platzieren target_link_libraries nach den Zeilen add_executable und find_package , damit alle verknüpften Komponenten bekannt sind.
Murphy

52

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

7
Die link_directories sind nicht erforderlich, da Boost_LIBRARIES vollständig qualifizierte Pfade sind.
RobertJMaynard

In meinem Fall war link_directories notwendig.
mgruber4

25

Wenn Sie die @ MOnsDaR-Antwort für die moderne CMake-Syntax mit importierten Zielen anpassen, wäre dies:

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

Beachten Sie, dass es nicht erforderlich ist, die Include-Verzeichnisse manuell anzugeben, da dies bereits über das importierte Ziel erledigt wird Boost::program_options.


Der Nachteil dieses Zielansatzes ist, dass dies wahrscheinlich fehlschlägt, wenn Ihre Boost-Version neuer als Ihre CMake-Version ist. The FindBoost.cmakeDiese werden ursprünglich nur erstellt, wenn Ihre Boost-Version explizit aufgeführt ist. Irgendwann sollte dies verbessert werden, aber ich sehe immer noch Fehler mit CMake 3.10.2 und Boost 1.66 (neueste Kopien von Brew).
Henry Schreiner

4
Der Stapelüberlauf schlägt fehl, weil es so viele veraltete Antworten gibt, dass es oft schwierig ist, die richtige Antwort zu finden (diese).
Carlo Wood

3

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 sich unter Ubuntu befinden), müssen Sie zwei Dinge tun:

  1. Installieren libboost-program-options-dev damit Sie darauf verlinken können.
  2. Sagen Sie cmake, gegen zu verlinken libboost_program_options.

Ich benutze meistens Makefiles, also hier ist 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 scheint nicht viel zu tun.

Für CMake müssen Sie boost_program_options zur Liste der Bibliotheken hinzufügen, und IIRC erfolgt über SET(liblist boost_program_options)in Ihrem CMakeLists.txt.


11
Ihr CMake-Rat ist falsch (siehe die akzeptierte Antwort), und Ihr Befehlszeilen-Rat ist nicht sehr hilfreich, da die Frage CMake betraf.
Ela782

3

Normalerweise gibt es zwei Möglichkeiten, den Standardinstallationspfad des Systems zu verwenden /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, /home/xy/boost_install/lib/dass ich im obigen Verzeichnis Boost installiere:

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/

Wenn Sie an der Verwendung eines lokal installierten Boost interessiert sind, wird diese Frage angezeigt. Wie kann ich CMake dazu bringen, meine alternative Boost-Installation zu finden? .


2

Hier ist meine Einstellung:

cmake_minimum_required(VERSION 3.15)

project(TryOuts LANGUAGES CXX)

find_package(Boost QUIET REQUIRED COMPONENTS program_options)

if(NOT Boost_FOUND)
    message(FATAL_ERROR "Boost Not found")
endif()

add_executable(helloworld main.cpp)

target_link_libraries(helloworld PUBLIC Boost::program_options)

target_link_libraries (helloworld PUBLIC Boost :: program_options) gibt einen CMAKE-Fehler aus: - Konfigurieren des erledigten CMake-Fehlers in CMakeLists.txt: 102 (add_executable): Ziel "DB32" -Links zum Ziel "Boost :: program_options", aber das Ziel wurde nicht gefunden . Möglicherweise fehlt ein Aufruf von find_package () für ein IMPORTED-Ziel oder ein ALIAS-Ziel?
Munsingh

Hallo, danke für das Feedback. Es scheint, dass der CMake Boost auf Ihrem System nicht finden kann. Vielleicht ist es besser, den Boost aus der Quelle neu zu bauen. Zuvor möchten Sie möglicherweise Folgendes versuchen: Suchen Sie das Paket mit find_package(Boost QUIET REQUIRED)und verknüpfen Sie es mit Ihrem Ziel (DB32):target_link_libraries(DB32 PUBLIC Boost::headers)
adem
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.