Як зв’язати програму C ++ з Boost за допомогою CMake


109

Як повинен виглядати мій файл CMake для з'єднання моєї програми з бібліотекою Boost під Ubuntu?

Помилки, показані під час запуску make:

main.cpp:(.text+0x3b): undefined reference to `boost::program_options::options_description::m_default_line_length'

Головний файл дійсно простий:

#include <boost/program_options/options_description.hpp>
#include <boost/program_options/option.hpp>
using namespace std;
#include <iostream>

namespace po = boost::program_options;

int main(int argc, char** argv) {

    po::options_description desc("Allowed options");
    desc.add_options()
        ("help", "produce help message")
        ;

    return 0;
}

Мені вдалося це зробити. Єдині рядки, які я додав у свої файли CMake:

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)

Відповіді:


150

У CMake ви можете використовувати find_packageдля пошуку потрібних вам бібліотек. Зазвичай це FindBoost.cmakeпоряд з вашою установкою CMake.

Наскільки я пам’ятаю, він буде встановлений /usr/share/cmake/Modules/разом з іншими скриптами пошуку для загальних бібліотек. Ви можете просто перевірити документацію у цьому файлі, щоб отримати додаткові відомості про те, як він працює.

Приклад з голови:

FIND_PACKAGE( Boost 1.40 COMPONENTS program_options REQUIRED )
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )

ADD_EXECUTABLE( anyExecutable myMain.cpp )

TARGET_LINK_LIBRARIES( anyExecutable LINK_PUBLIC ${Boost_LIBRARIES} )

Я сподіваюся, що цей код допомагає.


2
Додано робоче посилання від Kitwares Github repo. Також додано посилання на офіційну документацію про FindBoost.cmake
MOnsDaR

1
Чому зокрема збільшувати 1,40? Коли основні функції бібліотеки перестали змінюватися?
jgyou

6
Бо чому б і ні? Це лише приклад ... Заповніть все, що вам підходить
MOnsDaR

5
Важлива деталь на місце target_link_libraries після add_executable і find_package ліній, тому всі пов'язані компоненти відомі.
Мерфі

52

Наступна моя конфігурація:

cmake_minimum_required(VERSION 2.8)
set(Boost_INCLUDE_DIR /usr/local/src/boost_1_46_1)
set(Boost_LIBRARY_DIR /usr/local/src/boost_1_46_1/stage/lib)
find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})

add_executable(main main.cpp)
target_link_libraries( main ${Boost_LIBRARIES} )

7
Link_directories не потрібно, оскільки Boost_LIBRARIES буде повністю кваліфікованими шляхами.
RobertJMaynard

У моєму випадку link_directories було необхідне.
mgruber4

25

Адаптація відповіді @MOnsDaR для сучасного синтаксису CMake з імпортованими цілями, це:

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

Зауважте, що не потрібно вказувати каталоги включення вручну, оскільки це вже вирішено через імпортовану ціль Boost::program_options.


Мінусом цього цільового підходу є те, що якщо ваша версія Boost новіша, ніж версія CMake, це, ймовірно, не вдасться. The FindBoost.cmakeспочатку створює їх лише у тому випадку, якщо в ньому чітко вказано Вашу версію Boost. У якийсь момент це повинно було бути покращене, але я все ще бачу невдачі з CMake 3.10.2 та Boost 1.66 (новітні копії з самогону).
Генрі Шрайнер

4
stackoverflow починає провалюватися, оскільки існує стільки застарілих відповідей, що часто важко знайти правильну відповідь (цю).
Карло Вуд

3

Яка збільшити бібліотеку? Багато з них є чистими шаблонами і не потребують посилання.

Тепер із тим фактично показаним конкретним прикладом, який говорить нам про те, що ви хочете параметри програми Boost (а ще більше сказали нам, що ви перебуваєте на Ubuntu), вам потрібно зробити дві речі:

  1. Встановіть libboost-program-options-devтак, щоб ви могли зв’язатись із цим.
  2. Скажіть, cmakeщоб посилання проти libboost_program_options.

Я в основному використовую Makefiles, тому ось пряме використання командного рядка:

$ g++ boost_program_options_ex1.cpp -o bpo_ex1 -lboost_program_options
$ ./bpo_ex1
$ ./bpo_ex1 -h
$ ./bpo_ex1 --help
$ ./bpo_ex1 -help
$

Це здається не дуже багато.

Для CMake вам потрібно додати boost_program_options до списку бібліотек, а IIRC це робиться за допомогою SET(liblist boost_program_options)у вашій CMakeLists.txt.


11
Ваша порада CMake неправильна (див. Прийняту відповідь), а рада вашого командного рядка не дуже корисна, оскільки питання стосувалося CMake.
Ela782

3

Зазвичай, використовуючи шлях встановлення системи за замовчуванням /usr/lib/x86_64-linux-gnu/:

find_package(Boost REQUIRED regex date_time system filesystem thread graph)
include_directories(${BOOST_INCLUDE_DIRS})
message("boost lib: ${Boost_LIBRARIES}")
message("boost inc:${Boost_INCLUDE_DIR}")

add_executable(use_boost use_boost.cpp)
target_link_libraries(use_boost
        ${Boost_LIBRARIES}
        )

Якщо ви встановите Boost у локальному каталозі або виберете локальну установку замість встановлення системи, ви можете зробити це таким чином:

set( BOOST_ROOT "/home/xy/boost_install/lib/" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )

find_package(Boost REQUIRED regex date_time system filesystem thread graph)
include_directories(${BOOST_INCLUDE_DIRS})
message("boost lib: ${Boost_LIBRARIES}, inc:${Boost_INCLUDE_DIR}")

add_executable(use_boost use_boost.cpp)
target_link_libraries(use_boost
        ${Boost_LIBRARIES}
        )

Зверніть увагу на вищевказаний dir /home/xy/boost_install/lib/, де я встановлюю Boost:

xy@xy:~/boost_install/lib$ ll -th
total 16K
drwxrwxr-x 2 xy xy 4.0K May 28 19:23 lib/
drwxrwxr-x 3 xy xy 4.0K May 28 19:22 include/

xy@xy:~/boost_install/lib$ ll -th lib/
total 57M
drwxrwxr-x 2 xy xy 4.0K May 28 19:23 ./
-rw-rw-r-- 1 xy xy 2.3M May 28 19:23 libboost_test_exec_monitor.a
-rw-rw-r-- 1 xy xy 2.2M May 28 19:23 libboost_unit_test_framework.a
.......

xy@xy:~/boost_install/lib$ ll -th include/
total 20K
drwxrwxr-x 110 xy xy  12K May 28 19:22 boost/

Якщо вас цікавить, як використовувати локальний встановлений Boost, ви можете побачити це запитання. Як я можу CMake знайти альтернативну інсталяцію Boost? .


2

Ось моя думка:

cmake_minimum_required(VERSION 3.15)

project(TryOuts LANGUAGES CXX)

find_package(Boost QUIET REQUIRED COMPONENTS program_options)

if(NOT Boost_FOUND)
    message(FATAL_ERROR "Boost Not found")
endif()

add_executable(helloworld main.cpp)

target_link_libraries(helloworld PUBLIC Boost::program_options)

target_link_libraries (helloworld PUBLIC Boost :: program_options) видасть помилку CMAKE: - Налаштування зробленої помилки CMake на CMakeLists.txt: 102 (add_executable): Цільове посилання "DB32" на цільове "Boost :: program_options", але ціль не знайдена . Можливо, для імпортованої цілі відсутній виклик find_package (), або відсутня ціль ALIAS?
munsingh

Привіт, дякую за відгуки. Схоже, CMake не може знайти Boost у вашій системі. Можливо, вам краще зробити нову конструкцію Boost з джерела. Перед цим ви, можливо, захочете спробувати наступне: Знайдіть пакунок із find_package(Boost QUIET REQUIRED)і посилання на ціль (DB32):target_link_libraries(DB32 PUBLIC Boost::headers)
adem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.