Как добавить библиотеки Boost в CMakeLists.txt? - PullRequest
105 голосов
/ 11 июля 2011

Мне нужно добавить библиотеки Boost в мой CMakeLists.txt. Как ты это делаешь или как ты это добавляешь?

Ответы [ 6 ]

155 голосов
/ 11 июля 2011

Поместите это в свой файл CMakeLists.txt (измените любые параметры с OFF на ON, если хотите):

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

Очевидно, вам нужно поместить нужные библиотеки туда, куда я положил *boost libraries here*.Например, если вы используете библиотеку filesystem и regex, вы напишите:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)
73 голосов
/ 11 июля 2011

Вы можете использовать find_package для поиска доступных библиотек наддува. Откладывает поиск Boost до FindBoost.cmake , который по умолчанию установлен с CMake.

После нахождения Boost вызов find_package() заполнит множество переменных (проверьте ссылку на FindBoost.cmake ). Среди них - BOOST_INCLUDE_DIRS, Boost_LIBRARIES и Boost_XXX_LIBRARY с переменными, где XXX заменен определенными библиотеками Boost. Вы можете использовать их для указания include_directories и target_link_libraries .

Например, предположим, что вам нужны boost :: program_options и boost :: regex, вы должны сделать что-то вроде:

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

Некоторые общие советы:

  • При поиске FindBoost проверяет переменную среды $ ENV {BOOST_ROOT}. При необходимости вы можете установить эту переменную перед вызовом find_package.
  • Если у вас есть несколько сборочных версий boost (многопоточных, статических, общих и т. Д.), Вы можете указать желаемую конфигурацию перед вызовом find_package. Сделайте это, установив для некоторых из следующих переменных значение On: Boost_USE_STATIC_LIBS, Boost_USE_MULTITHREADED, Boost_USE_STATIC_RUNTIME
  • При поиске Boost в Windows позаботьтесь об автоматической привязке. Прочтите «ПРИМЕЧАНИЕ для пользователей Visual Studio» в справочнике .
    • Мой совет - отключить автоматическое связывание и использовать обработку зависимостей cmake: add_definitions( -DBOOST_ALL_NO_LIB )
    • В некоторых случаях вам может понадобиться явно указать, что используется динамическое повышение: add_definitions( -DBOOST_ALL_DYN_LINK )
20 голосов
/ 10 мая 2017

Адаптируя ответ @ LainIwakura для современного синтаксиса CMake с импортированными целями, это будет:

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

Обратите внимание, что больше нет необходимости указывать включаемые каталоги вручную, так как об этом уже заботятся импортированные цели Boost::filesystem и Boost::regex.
regex и filesystem могут быть заменены любыми необходимыми вам библиотеками повышения.

6 голосов
/ 29 января 2018

Может это может быть полезно для некоторых людей. У меня была непослушная ошибка: неопределенная ссылка на символ '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: ошибка при добавлении символов: DSO отсутствует в командной строке Была некоторая проблема cmakeList.txt, и почему-то мне не хватало, чтобы явно включить библиотеки "system" и "filesystem". Итак, я написал эти строки в CMakeLists.txt

Эти строки пишутся в начале перед созданием исполняемого файла проекта, так как на этом этапе нам не нужно связывать библиотеку boost с нашим исполняемым файлом проекта.

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)

Теперь в конце файла я написал эти строки, считая «KeyPointEvaluation» как исполняемый файл моего проекта.

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()
2 голосов
/ 09 ноября 2015

Я согласен с ответами 1 и 2 .Однако я предпочитаю указывать каждую библиотеку отдельно.Это делает зависимости более ясными в больших проектах.Тем не менее, существует опасность ошибочного ввода (чувствительных к регистру) имен переменных.В этом случае нет прямой ошибки cmake, но некоторые неопределенные проблемы с компоновщиком ссылок позже, что может занять некоторое время.Поэтому я использую следующую функцию 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)

Для приведенного выше примера это выглядит следующим образом:

VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARY Boost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} )

Если бы я написал «BOOST_PROGRAM_OPTIONS_LIBRARY», возникла бы ошибкаcmake и не намного позже запускается компоновщиком.

1 голос
/ 06 сентября 2018

Попробуйте как говорится Повысьте документацию :

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

Не забудьте заменить foo на имя вашего проекта и компоненты на ваш!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...