Zwróć uwagę, że nie musisz określać komponentów dla bibliotek zawierających tylko nagłówki, takich jak lexical_cast. Dlatego potrzebujesz tylko polecenia find_packagei include_directories.
miguel.martin
1
W systemie Windows pomocne może być również dodanie tego do pliku cmake: ADD_DEFINITIONS (-DBOOST_ALL_NO_LIB) w przeciwnym razie możesz natknąć się na stackoverflow.com/questions/28887680/…
Stéphane
czy można ustawić BOOST_USE_STATIC_LIBS na ON i Boost_USE_STATIC_RUNTIME OFF? & vice versa.
kalmary
5
Co to *boost libraries here*znaczy?
Igor Ganapolsky
2
Możesz także użyć, FIND_PACKAGE(Boost REQUIRED COMPONENTS system)jeśli nie znasz dokładnej wersji wzmocnienia do użycia
smac89
78
Możesz użyć find_package, aby wyszukać dostępne biblioteki boost. Odracza wyszukiwanie Boost to FindBoost.cmake , który jest domyślnie instalowany z CMake.
Po znalezieniu Boost, find_package()wywołanie wypełni wiele zmiennych (sprawdź odniesienie do FindBoost.cmake ). Wśród nich są BOOST_INCLUDE_DIRSzmienne Boost_LIBRARIES i Boost_XXX_LIBRARY, przy czym XXX zastąpiono określonymi bibliotekami Boost. Możesz ich użyć do określenia include_directories i target_link_libraries .
Na przykład, załóżmy, że potrzebujesz boost :: program_options i boost :: regex, zrobiłbyś coś takiego:
find_package(Boost REQUIRED COMPONENTS program_options regex )
include_directories( ${Boost_INCLUDE_DIRS})
add_executable( run main.cpp )# Example application based on main.cpp# Alternatively you could use ${Boost_LIBRARIES} here.
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
Kilka ogólnych wskazówek:
Podczas wyszukiwania FindBoost sprawdza zmienną środowiskową $ ENV {BOOST_ROOT}. W razie potrzeby możesz ustawić tę zmienną przed wywołaniem find_package.
Jeśli masz wiele wersji kompilacji boost (wielowątkowych, statycznych, współdzielonych itp.), Możesz określić żądaną konfigurację przed wywołaniem find_package. Czy to poprzez ustawienie niektóre z następujących zmiennych On: Boost_USE_STATIC_LIBS, Boost_USE_MULTITHREADED,Boost_USE_STATIC_RUNTIME
Szukając Boost w systemie Windows, uważaj na automatyczne łączenie. Przeczytaj „UWAGA dla użytkowników programu Visual Studio” w odwołaniu .
Radzę wyłączyć automatyczne łączenie i skorzystać z obsługi zależności cmake: add_definitions( -DBOOST_ALL_NO_LIB )
W niektórych przypadkach może być konieczne wyraźne określenie, że używane jest dynamiczne wzmocnienie: add_definitions( -DBOOST_ALL_DYN_LINK )
Zauważ, że nie jest już konieczne ręczne określanie katalogów dołączania, ponieważ jest to już obsługiwane przez zaimportowane cele Boost::filesystemi Boost::regex. regexi filesystemmożna je zastąpić dowolnymi potrzebnymi bibliotekami boost.
Jak by to wyglądało, gdybyś chciał powiedzieć link przeciwko wszystkim wzmocnieniom? To znaczy bez wymieniania wszystkich bibliotek, które są w fazie przyspieszenia.
Toby Brull
4
Jeśli używasz tylko części wzmocnienia tylko z nagłówka, wystarczy „Boost :: boost”. Wszystkie skompilowane biblioteki boost muszą być jawnie określone.
oLen
2
@oLen Gdzie znajdę listę wszystkich zaimportowanych celów cmake Boost :: *? Skąd mam wiedzieć, do którego mam link?
Markus,
8
Może to mogłoby pomóc niektórym ludziom. Wystąpił niegrzeczny błąd:
niezdefiniowane odniesienie do symbolu '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: błąd dodawanie symboli: brak DSO w linii poleceń
Wystąpił problem z cmakeList.txt i jakoś brakowało mi jawnego dołączenia bibliotek „system” i „system plików”. Tak więc napisałem te wiersze w CMakeLists.txt
Te wiersze są zapisywane na początku przed utworzeniem pliku wykonywalnego projektu, ponieważ na tym etapie nie musimy łączyć biblioteki boost z plikiem wykonywalnym projektu.
Zgadzam się z odpowiedziami 1 i 2 . Jednak wolę osobno określić każdą bibliotekę. To sprawia, że zależności są wyraźniejsze w dużych projektach. Istnieje jednak niebezpieczeństwo błędnego wpisania nazw zmiennych (z uwzględnieniem wielkości liter). W takim przypadku nie ma bezpośredniego błędu cmake, ale później pojawiają się pewne problemy z nieokreślonymi odwołaniami, których rozwiązanie może zająć trochę czasu. Dlatego używam następującej funkcji cmake:
function(VerifyVarDefined)
foreach(lib ${ARGV})if(DEFINED ${lib})else(DEFINED ${lib})
message(SEND_ERROR "Variable ${lib} is not defined")
endif(DEFINED ${lib})
endforeach()
endfunction(VerifyVarDefined)
W powyższym przykładzie wygląda to następująco:
VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARYBoost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
Gdybym napisał „BOOST_PROGRAM_OPTIONS_LIBRARY”, wystąpiłby błąd wywołany przez cmake, a niewiele później wywołany przez linker.
Odpowiedzi:
Umieść to w swoim
CMakeLists.txt
pliku (zmień dowolne opcje z WYŁ. Na WŁ., Jeśli chcesz):Oczywiście musisz umieścić wybrane biblioteki tam, gdzie ja
*boost libraries here*
. Na przykład, jeśli używasz bibliotekifilesystem
iregex
, napisz:źródło
lexical_cast
. Dlatego potrzebujesz tylko poleceniafind_package
iinclude_directories
.*boost libraries here*
znaczy?FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
jeśli nie znasz dokładnej wersji wzmocnienia do użyciaMożesz użyć find_package, aby wyszukać dostępne biblioteki boost. Odracza wyszukiwanie Boost to FindBoost.cmake , który jest domyślnie instalowany z CMake.
Po znalezieniu Boost,
find_package()
wywołanie wypełni wiele zmiennych (sprawdź odniesienie do FindBoost.cmake ). Wśród nich sąBOOST_INCLUDE_DIRS
zmienne Boost_LIBRARIES i Boost_XXX_LIBRARY, przy czym XXX zastąpiono określonymi bibliotekami Boost. Możesz ich użyć do określenia include_directories i target_link_libraries .Na przykład, załóżmy, że potrzebujesz boost :: program_options i boost :: regex, zrobiłbyś coś takiego:
Kilka ogólnych wskazówek:
On
:Boost_USE_STATIC_LIBS
,Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
źródło
Dostosowując odpowiedź @ LainIwakura do nowoczesnej składni CMake z zaimportowanymi celami, wyglądałoby to tak:
Zauważ, że nie jest już konieczne ręczne określanie katalogów dołączania, ponieważ jest to już obsługiwane przez zaimportowane cele
Boost::filesystem
iBoost::regex
.regex
ifilesystem
można je zastąpić dowolnymi potrzebnymi bibliotekami boost.źródło
Może to mogłoby pomóc niektórym ludziom. Wystąpił niegrzeczny błąd: niezdefiniowane odniesienie do symbolu '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: błąd dodawanie symboli: brak DSO w linii poleceń Wystąpił problem z cmakeList.txt i jakoś brakowało mi jawnego dołączenia bibliotek „system” i „system plików”. Tak więc napisałem te wiersze w CMakeLists.txt
Te wiersze są zapisywane na początku przed utworzeniem pliku wykonywalnego projektu, ponieważ na tym etapie nie musimy łączyć biblioteki boost z plikiem wykonywalnym projektu.
Teraz na końcu pliku napisałem te wiersze, biorąc pod uwagę „KeyPointEvaluation” jako plik wykonywalny mojego projektu.
źródło
Zgadzam się z odpowiedziami 1 i 2 . Jednak wolę osobno określić każdą bibliotekę. To sprawia, że zależności są wyraźniejsze w dużych projektach. Istnieje jednak niebezpieczeństwo błędnego wpisania nazw zmiennych (z uwzględnieniem wielkości liter). W takim przypadku nie ma bezpośredniego błędu cmake, ale później pojawiają się pewne problemy z nieokreślonymi odwołaniami, których rozwiązanie może zająć trochę czasu. Dlatego używam następującej funkcji cmake:
W powyższym przykładzie wygląda to następująco:
Gdybym napisał „BOOST_PROGRAM_OPTIONS_LIBRARY”, wystąpiłby błąd wywołany przez cmake, a niewiele później wywołany przez linker.
źródło
Spróbuj jak powiedzieć Dokumentacja doładowania :
Nie zapomnij zamienić foo na nazwę swojego projektu, a komponenty na swoje!
źródło