Очевидно, вам нужно поместить нужные библиотеки туда, куда я положил *boost libraries here*. Например, если вы используете filesystemи regexбиблиотеку вы бы написать:
Обратите внимание, что вам не нужно указывать компоненты для библиотек только для заголовков, например lexical_cast. Таким образом, вам нужна только команда find_packageи include_directories.
miguel.martin
1
В Windows это также может помочь добавить это в ваш файл cmake: ADD_DEFINITIONS (-DBOOST_ALL_NO_LIB), иначе вы можете столкнуться с stackoverflow.com/questions/28887680/…
Стефан
можно ли установить BOOST_USE_STATIC_LIBS в положение ON и Boost_USE_STATIC_RUNTIME OFF? & наоборот.
кальмар
5
Что *boost libraries here*значит?
Игорь Ганапольский
2
Вы также можете использовать, FIND_PACKAGE(Boost REQUIRED COMPONENTS system)если не знаете точную версию повышения для использования
smac89
78
Вы можете использовать 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 )
Обратите внимание, что больше нет необходимости указывать подключаемые каталоги вручную, поскольку об этом уже позаботились с помощью импортированных целей Boost::filesystemи Boost::regex. regexи filesystemможет быть заменен любыми необходимыми библиотеками ускорения.
Как бы это выглядело, если бы вы хотели сказать ссылку на все ускорение? Я имею в виду, не перечисляя все библиотеки, которые находятся в стадии повышения.
Toby Brull
4
Если вы используете только заголовочные части boost, 'Boost :: boost' будет достаточно. Все скомпилированные библиотеки ускорения должны быть указаны явно.
oLen
2
@oLen Где мне найти список всех импортированных целей cmake Boost :: *? Как мне узнать, на что я должен ссылаться?
Маркус
8
Возможно, это может быть полезно для некоторых людей. У меня была непослушная ошибка:
неопределенная ссылка на символ '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: ошибка добавления символов: DSO отсутствует в командной строке
Возникла проблема с cmakeList.txt и почему-то мне не хватало явно включить библиотеки "system" и "filesystem". Итак, эти строки я написал в CMakeLists.txt
Эти строки написаны в начале перед созданием исполняемого файла проекта, так как на этом этапе нам не нужно связывать библиотеку boost с исполняемым файлом проекта.
Я согласен с ответами 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_LIBRARYBoost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
Если бы я написал «BOOST_PROGRAM_OPTIONS_LIBRARY», была бы ошибка, вызванная cmake, а не намного позже вызванная компоновщиком.
Ответы:
Поместите это в свой
CMakeLists.txt
файл (измените любые параметры с ВЫКЛ на ВКЛ, если хотите):Очевидно, вам нужно поместить нужные библиотеки туда, куда я положил
*boost libraries here*
. Например, если вы используете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, вы должны сделать что-то вроде:
Несколько общих советов:
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 с импортированными целями, это будет:
Обратите внимание, что больше нет необходимости указывать подключаемые каталоги вручную, поскольку об этом уже позаботились с помощью импортированных целей
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 с исполняемым файлом проекта.
Теперь, в конце файла, я написал эти строки, считая "KeyPointEvaluation" исполняемым файлом проекта.
источник
Я согласен с ответами 1 и 2 . Однако я предпочитаю указывать каждую библиотеку отдельно. Это делает зависимости более понятными в больших проектах. Тем не менее, существует опасность ошибочного ввода (с учетом регистра) имен переменных. В этом случае нет прямой ошибки cmake, но позже возникают некоторые проблемы с компоновщиком неопределенных ссылок, для устранения которых может потребоваться некоторое время. Поэтому я использую следующую функцию cmake:
В приведенном выше примере это выглядит так:
Если бы я написал «BOOST_PROGRAM_OPTIONS_LIBRARY», была бы ошибка, вызванная cmake, а не намного позже вызванная компоновщиком.
источник
Попробуйте сказать документацию Boost :
Не забудьте заменить foo на имя своего проекта, а компоненты - на свое!
источник