CMake kullanarak C ++ programını Boost ile bağlama


109

Programımı Ubuntu altındaki Boost kitaplığına bağlamak için CMake dosyam nasıl görünmelidir?

Çalıştırma sırasında gösterilen hatalar make:

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

Ana dosya gerçekten çok basit:

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

Ben bunu başardım. CMake dosyalarıma eklediğim tek satırlar şunlardı:

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)

Yanıtlar:


150

CMake'de find_packageihtiyacınız olan kitaplıkları bulmak için kullanabilirsiniz . Genellikle FindBoost.cmakeCMake kurulumunuzla birlikte bir tane vardır .

Hatırladığım kadarıyla, /usr/share/cmake/Modules/ortak kitaplıklar için diğer bulma betikleri ile birlikte yüklenecek . Nasıl çalıştığı hakkında daha fazla bilgi için o dosyadaki belgelere bakabilirsiniz.

Kafamdan bir örnek:

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

Umarım bu kod yardımcı olur.


2
Kitwares Github deposundan çalışan bir bağlantı eklendi. Ayrıca FindBoost.cmake
MOnsDaR ile

1
Neden özellikle 1.40'ı Boost? Kitaplığın temel işlevlerinin değişmesi ne zaman durdu?
jgyou

6
Çünkü neden olmasın? Bu sadece bir örnek ... Size en uygun
olanı

5
Önemli bir ayrıntı yere olduğunu target_link_libraries sonra add_executable ve find_package , çizgiler böylece tüm bağlantılı bileşenler bilinmektedir.
Murphy

52

Aşağıdaki konfigürasyonum:

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
Boost_LIBRARIES tam olarak nitelenmiş yollar olacağından, link_dizinleri gerekli değildir.
RobertJMaynard

Benim durumumda link_directories gerekliydi.
mgruber4

25

@MOnsDaR yanıtını, içe aktarılan hedeflerle modern CMake sözdizimi için uyarlayarak, bu şöyle olur:

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

İçerme dizinlerini manuel olarak belirtmenin gerekli olmadığını unutmayın, çünkü bu, içe aktarılan hedef aracılığıyla zaten halledilir Boost::program_options.


Bu hedef yaklaşımın dezavantajı, Boost sürümünüz CMake sürümünüzden daha yeni ise, bu muhtemelen başarısız olacaktır. The FindBoost.cmakebaşlangıçta bunları yalnızca Boost sürümünüzü açıkça listeliyorsa oluşturur. Bir noktada bunun iyileştirilmesi gerekiyordu, ancak hala CMake 3.10.2 ve Boost 1.66 (demlemeden en yeni kopyalar) ile başarısızlıklar görüyorum.
Henry Schreiner

5
stackoverflow başarısız olmaya başlar çünkü o kadar çok eski cevap vardır ki doğru cevabı bulmak genellikle zordur (bu cevap).
Carlo Wood

3

Hangi Boost kitaplığı? Birçoğu saf şablonlardır ve bağlantı gerektirmez.

Şimdi, bize Boost program seçeneklerini istediğinizi söyleyen somut bir örnekle (ve daha da fazlası bize Ubuntu'da olduğunuzu söyledi), iki şey yapmanız gerekir:

  1. libboost-program-options-devKarşı bağlantı kurabilmek için kurun .
  2. cmakeKarşı bağlantı kurmayı söyle libboost_program_options.

Çoğunlukla Makefiles kullanıyorum, bu yüzden doğrudan komut satırı kullanımı:

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

Görünüşe göre pek bir şey yapmıyor.

CMake için, kütüphanelerin listesine boost_program_options eklemek gerekir ve IIRC bu aracılığıyla yapılır SET(liblist boost_program_options)Gözlerinde farklı CMakeLists.txt.


11
CMake tavsiyeniz yanlış (kabul edilen cevaba bakın) ve soru CMake ile ilgili olduğu için komuta hattındaki tavsiyeniz pek yardımcı olmadı.
Ela782

3

Sistem varsayılan yükleme yolunu kullanmanın iki yolu, genellikle /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}
        )

Boost'u yerel bir dizine kurarsanız veya sistem kurulumu yerine yerel kurulumu seçerseniz, bunu şu şekilde yapabilirsiniz:

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

Yukarıdaki dizinin /home/xy/boost_install/lib/Boost'u kurduğum yer olduğunu unutmayın :

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/

Yerel olarak kurulu bir Boost'u nasıl kullanacağınızla ilgileniyorsanız, bu soruyu görebilirsiniz CMake'in alternatif Boost kurulumumu bulmasını nasıl sağlayabilirim? .


2

İşte benim almam:

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) bir CMAKE hatası verecektir: - CMakeLists.txt'de yapılan CMake Hatasını yapılandırma: 102 (add_executable): "Boost :: program_options" öğesini hedeflemek için "DB32" bağlantılarını hedefleyin, ancak hedef bulunamadı . IMPORTED hedef için bir find_package () çağrısı eksik olabilir veya bir ALIAS hedefi eksik olabilir?
munsingh

Merhaba, geri bildiriminiz için teşekkürler. Görünüşe göre CMake sisteminizde Boost'u bulamıyor. Belki de kaynaktan yeni bir Boost derlemesi yapsan daha iyi olur. Bundan önce aşağıdakileri denemek isteyebilirsiniz: Paketi bulun find_package(Boost QUIET REQUIRED)ve hedefinize bağlanın (DB32):target_link_libraries(DB32 PUBLIC Boost::headers)
adem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.