Jak dodać biblioteki Boost w CMakeLists.txt?

Muszę dodać biblioteki Boost do moich Cmakelist.txt. Jak to zrobić lub jak dodać?

 135
Author: Peter Mortensen, 2011-07-11

7 answers

Umieść to w pliku CMakeLists.txt (zmień dowolne opcje z OFF na ON 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ć biblioteki, które chcesz tam, gdzie ja umieścić *boost libraries here*. Na przykład, jeśli używasz biblioteki filesystem i regex, napiszesz:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)
 178
Author: LainIwakura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-09 02:57:58

Możesz użyć find_package aby wyszukać dostępne biblioteki boost. Odkłada poszukiwanie Boosta na FindBoost.cmake, który jest domyślnie zainstalowany z CMake.

Po znalezieniu Boost, wywołanie find_package() będzie wypełniało wiele zmiennych (sprawdź referencję dla FindBoost.cmake ). Wśród nich są BOOST_INCLUDE_DIRS, boost_libraries i boost_xxx_library variabels, z XXX zastąpionymi konkretnymi bibliotekami Boost. Można 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, zrobisz coś w stylu:

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.
  • gdy masz wiele wersji kompilacji boost (wielowątkowe, statyczne, współdzielone itp.) możesz określ żądaną konfigurację przed wywołaniem find_package. Zrób to, ustawiając niektóre z następujących zmiennych na On: Boost_USE_STATIC_LIBS, Boost_USE_MULTITHREADED, Boost_USE_STATIC_RUNTIME
  • podczas wyszukiwania Boost w systemie Windows, uważaj na automatyczne linkowanie. Przeczytaj "notatkę dla użytkowników Visual Studio" w dokumencie .
    • radzę wyłączyć automatyczne linkowanie i używać 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żywany jest dynamiczny Boost: add_definitions( -DBOOST_ALL_DYN_LINK )
 81
Author: André,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-19 10:06:34

Adaptując odpowiedź @Lainiwakury dla nowoczesnej składni CMake z importowanymi celami, byłoby to:

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 include, ponieważ są one już obsługiwane przez zaimportowane cele Boost::filesystem i Boost::regex.
regex i filesystem można zastąpić dowolnymi bibliotekami boost, których potrzebujesz.

 24
Author: oLen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-10 07:04:43

Może to może być pomocne dla niektórych ludzi. Miałem niegrzeczny błąd: undefined reference to symbol'_zn5boost6system15system_category' //usr / lib / x86_64-linux-gnu / libboost_system.so.1.58.0: błąd dodawania symboli: brak DSO z linii poleceń Były pewne problemy z cmakeList.txt i jakoś mi brakowało do jawnego włączenia bibliotek "system" i "filesystem". Więc napisałem te wersy w Cmakelistach.txt

Te linie są zapisywane na początku przed utworzeniem wykonywalny projektu, ponieważ na tym etapie nie musimy łączyć biblioteki boost z naszym wykonywalnym projektem.

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 linie, rozważając "KeyPointEvaluation" jako mój program wykonywalny.

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()
 8
Author: Spandan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-29 10:06:39

Spróbuj powiedzieć zwiększ dokumentację :

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 wymienić foo na nazwę projektu i komponenty na swoje!

 3
Author: Nikolay Pakudin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-06 12:57:31

Zgadzam się z odpowiedziami 1 oraz 2. Jednak wolę określić każdą bibliotekę osobno. To sprawia, że depencencje są jaśniejsze w dużych projektach. Istnieje jednak niebezpieczeństwo błędnego wpisania nazw zmiennych (uwzględniających wielkość liter). W takim przypadku nie ma bezpośredniego błędu cmake, ale niektóre niezdefiniowane odwołania problemy z linkerem później, które mogą zająć trochę czasu, aby rozwiązać. 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)

Na powyższym przykładzie wygląda to like:

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", pojawiłby się błąd wywołany przez cmake i niewiele później wywołany przez linker.

 2
Author: MarkusParker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:01

Dodatkowe informacje na temat odpowiedzi dla tych, którzy nadal mają problemy.

  1. ostatnia wersja Cmake ' a FindBoost.cmake może nie zawierać ostatniego wersja Fo Boost. Dodaj go w razie potrzeby.
  2. Użyj flagi-DBoost_DEBUG=0 configuration, aby zobaczyć informacje o problemach.
  3. Patrz biblioteka Format nazewnictwa . W razie potrzeby użyj var przyrostków Boost_COMPILER i Boost_ARCHITECTURE.
 0
Author: ephemerr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-04 12:31:25