Jak powinien wyglądać mój plik CMake do łączenia mojego programu z biblioteką Boost w systemie Ubuntu?
Błędy wyświetlane podczas uruchamiania make
:
main.cpp:(.text+0x3b): undefined reference to `boost::program_options::options_description::m_default_line_length'
Główny plik jest naprawdę prosty:
#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;
}
Udało mi się to zrobić. Jedyne wiersze, które dodałem do moich plików CMake, to:
target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)
target_link_libraries
poadd_executable
ifind_package
linii, więc wszystko połączone składniki są znane.Oto moja konfiguracja:
źródło
Dostosowanie odpowiedzi @MOnsDaR do nowoczesnej składni CMake z zaimportowanymi celami wyglądałoby tak:
Zauważ, że nie jest konieczne ręczne określanie katalogów dołączanych, ponieważ jest to już obsługiwane przez importowany cel
Boost::program_options
.źródło
The FindBoost.cmake
pierwotnie tworzy je tylko wtedy, gdy wyraźnie wymienia Twoją wersję Boost. W pewnym momencie miało to zostać poprawione, ale nadal widzę awarie z CMake 3.10.2 i Boost 1.66 (najnowsze kopie z brew).Która biblioteka Boost? Wiele z nich to czyste szablony i nie wymagają linkowania.
Teraz z tym faktycznie pokazanym konkretnym przykładem, który mówi nam, że chcesz opcji programu Boost (a nawet więcej powiedział nam, że jesteś na Ubuntu), musisz zrobić dwie rzeczy:
libboost-program-options-dev
, aby móc połączyć się z nim.cmake
aby połączyćlibboost_program_options
.Głównie używam Makefiles, więc tutaj jest bezpośrednie użycie w linii poleceń:
Wydaje się, że to niewiele robi.
W przypadku CMake musisz dodać boost_program_options do listy bibliotek, a IIRC odbywa się za pośrednictwem
SET(liblist boost_program_options)
twojegoCMakeLists.txt
.źródło
Na dwa sposoby, zwykle używając domyślnej ścieżki instalacji systemu
/usr/lib/x86_64-linux-gnu/
:Jeśli zainstalujesz Boost w katalogu lokalnym lub wybierzesz instalację lokalną zamiast instalacji systemu, możesz to zrobić w ten sposób:
Zauważ, że powyższy katalog
/home/xy/boost_install/lib/
to miejsce, w którym instaluję Boost:Jeśli interesuje Cię, jak korzystać z lokalnego, zainstalowanego Boost, możesz zobaczyć to pytanie Jak mogę sprawić, by CMake znalazł moją alternatywną instalację Boost? .
źródło
Oto moje podejście:
źródło
find_package(Boost QUIET REQUIRED)
i link do celu (DB32):target_link_libraries(DB32 PUBLIC Boost::headers)