Ответы:
Поместите это в свой CMakeLists.txt
файл (измените любые параметры с ВЫКЛ на ВКЛ, если хотите):
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)
lexical_cast
. Таким образом, вам нужна только команда find_package
и include_directories
.
*boost libraries here*
значит?
FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
если не знаете точную версию повышения для использования
Вы можете использовать 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} )
Несколько общих советов:
On
: Boost_USE_STATIC_LIBS
, Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
Адаптируя ответ @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
может быть заменен любыми необходимыми библиотеками ускорения.
Возможно, это может быть полезно для некоторых людей. У меня была непослушная ошибка: неопределенная ссылка на символ '_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()
Я согласен с ответами 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, а не намного позже вызванная компоновщиком.
Попробуйте сказать документацию Boost :
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 на имя своего проекта, а компоненты - на свое!