Odpowiedzi:
Umieść to w swoim CMakeLists.txt
pliku (zmień dowolne opcje z WYŁ. Na WŁ., Jeśli chcesz):
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS *boost libraries here*)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(progname file1.cxx file2.cxx)
target_link_libraries(progname ${Boost_LIBRARIES})
endif()
Oczywiście musisz umieścić wybrane biblioteki tam, gdzie ja *boost libraries here*
. Na przykład, jeśli używasz biblioteki filesystem
i regex
, napisz:
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
lexical_cast
. Dlatego potrzebujesz tylko polecenia find_package
i include_directories
.
*boost libraries here*
znaczy?
FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
jeśli nie znasz dokładnej wersji wzmocnienia do użycia
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_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:
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:
On
: Boost_USE_STATIC_LIBS
, Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
Dostosowując odpowiedź @ LainIwakura do nowoczesnej składni CMake z zaimportowanymi celami, wyglądałoby to tak:
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
if(Boost_FOUND)
add_executable(progname file1.cxx file2.cxx)
target_link_libraries(progname Boost::filesystem Boost::regex)
endif()
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
i Boost::regex
.
regex
i filesystem
można je zastąpić dowolnymi potrzebnymi bibliotekami boost.
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.
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_NO_SYSTEM_PATHS TRUE)
if (Boost_NO_SYSTEM_PATHS)
set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
endif (Boost_NO_SYSTEM_PATHS)
find_package(Boost COMPONENTS regex date_time system filesystem thread graph program_options)
find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
find_package(Boost COMPONENTS program_options REQUIRED)
Teraz na końcu pliku napisałem te wiersze, biorąc pod uwagę „KeyPointEvaluation” jako plik wykonywalny mojego projektu.
if(Boost_FOUND)
include_directories(${BOOST_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
add_definitions(${Boost_DEFINITIONS})
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(KeyPointEvaluation ${Boost_LIBRARIES})
target_link_libraries( KeyPointEvaluation ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY})
endif()
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_LIBRARY Boost_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.
Spróbuj jak powiedzieć Dokumentacja doładowania :
set(Boost_USE_STATIC_LIBS ON) # only find static libs
set(Boost_USE_DEBUG_LIBS OFF) # ignore debug libs and
set(Boost_USE_RELEASE_LIBS ON) # only find release libs
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(foo foo.cc)
target_link_libraries(foo ${Boost_LIBRARIES})
endif()
Nie zapomnij zamienić foo na nazwę swojego projektu, a komponenty na swoje!