Cara menghubungkan program C ++ dengan Boost menggunakan CMake

109

Seperti apa tampilan file CMake saya untuk menautkan program saya dengan pustaka Boost di Ubuntu?

Kesalahan yang ditampilkan selama berjalan make:

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

File utamanya sangat sederhana:

#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;
}

Saya sudah berhasil melakukan itu. Satu-satunya baris yang saya tambahkan ke file CMake saya adalah:

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)
Szymon Lipiński
sumber

Jawaban:

150

Di CMake Anda dapat menggunakan find_packageuntuk menemukan perpustakaan yang Anda butuhkan. Biasanya ada FindBoost.cmakebersama dengan instalasi CMake Anda.

Sejauh yang saya ingat, ini akan diinstal /usr/share/cmake/Modules/bersama dengan skrip find lainnya untuk perpustakaan umum. Anda bisa memeriksa dokumentasi di file itu untuk informasi lebih lanjut tentang cara kerjanya.

Contoh di luar kepala saya:

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

Saya harap kode ini membantu.

MOnsDaR
sumber
2
Menambahkan tautan yang berfungsi dari Kitwares Github repo. Juga menambahkan tautan ke dokumentasi resmi tentang FindBoost.cmake
MOnsDaR
1
Mengapa Boost 1,40 khususnya? Kapan fungsi dasar perpustakaan berhenti berubah?
jgyou
6
Karena kenapa tidak? Ini hanya sebuah contoh ... Isi apa pun yang paling cocok untuk Anda
MOnsDaR
5
Detail penting adalah ke tempat target_link_libraries setelah itu add_executable dan find_package garis, sehingga semua komponen terkait dikenal.
Murphy
52

Berikut ini adalah konfigurasi saya:

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} )
Dean Chen
sumber
7
Link_directories tidak diperlukan karena Boost_LIBRARY akan menjadi jalur yang sepenuhnya memenuhi syarat.
RobertJMaynard
Dalam kasus saya, link_directories diperlukan.
mgruber4
25

Mengadaptasi jawaban @MOnsDaR untuk sintaks CMake modern dengan target yang diimpor, ini akan menjadi:

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

Perhatikan bahwa tidak perlu menentukan direktori include secara manual, karena sudah ditangani melalui target yang diimpor Boost::program_options.

oLen
sumber
Kelemahan dari pendekatan target ini adalah jika versi Boost Anda lebih baru dari versi CMake Anda, ini mungkin akan gagal. The FindBoost.cmakeawalnya membuat ini hanya jika secara eksplisit mencantumkan versi Peningkatan Anda. Pada titik tertentu ini seharusnya diperbaiki, tetapi saya masih melihat kegagalan dengan CMake 3.10.2 dan Boost 1.66 (salinan terbaru dari brew).
Henry Schreiner
4
stackoverflow mulai gagal karena ada begitu banyak jawaban yang ketinggalan zaman sehingga seringkali sulit untuk menemukan jawaban yang benar (yang ini).
Carlo Wood
3

Perpustakaan Boost yang mana? Banyak di antaranya adalah templat murni dan tidak perlu ditautkan.

Sekarang dengan contoh konkret yang benar-benar ditunjukkan yang memberi tahu kami bahwa Anda menginginkan opsi program Boost (dan bahkan memberi tahu kami bahwa Anda menggunakan Ubuntu), Anda perlu melakukan dua hal:

  1. Instal libboost-program-options-devagar Anda dapat menautkannya.
  2. Katakan cmakeuntuk menautkan libboost_program_options.

Saya kebanyakan menggunakan Makefiles jadi berikut adalah penggunaan baris perintah langsung:

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

Sepertinya tidak banyak membantu.

Untuk CMake, Anda perlu menambahkan boost_program_options ke daftar pustaka, dan IIRC ini dilakukan melalui SET(liblist boost_program_options)di CMakeLists.txt.

Dirk Eddelbuettel
sumber
11
Saran CMake Anda salah (lihat jawaban yang diterima), dan saran baris perintah Anda tidak terlalu membantu karena pertanyaannya tentang CMake.
Ela782
3

Dua cara, menggunakan jalur penginstalan default sistem, biasanya /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}
        )

Jika Anda menginstal Boost di direktori lokal atau memilih penginstalan lokal daripada penginstalan sistem, Anda dapat melakukannya dengan ini:

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

Perhatikan dir di atas /home/xy/boost_install/lib/adalah tempat saya menginstal Boost:

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/

Jika Anda tertarik dengan cara menggunakan Boost yang terinstal secara lokal, Anda dapat melihat pertanyaan ini Bagaimana saya bisa mendapatkan CMake untuk menemukan instalasi Boost alternatif saya? .

Jayhello
sumber
2

Ini pendapat saya:

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)
adem
sumber
target_link_libraries (helloworld PUBLIC Boost :: program_options) akan memberikan kesalahan CMAKE: - Konfigurasi Kesalahan CMake selesai di CMakeLists.txt: 102 (add_executable): Target "DB32" menautkan ke target "Boost :: program_options" tetapi target tidak ditemukan . Mungkin panggilan find_package () tidak ada untuk target IMPORTED, atau target ALIAS hilang?
munsingh
Hai, terima kasih atas tanggapannya. Sepertinya CMake tidak dapat menemukan Boost di sistem Anda. Mungkin lebih baik Anda membuat Boost baru dari sumbernya. Sebelum itu Anda mungkin ingin mencoba yang berikut: Temukan paket dengan find_package(Boost QUIET REQUIRED)dan tautan ke target Anda (DB32):target_link_libraries(DB32 PUBLIC Boost::headers)
adem