Как связать программу на С++ с помощью Boost с помощью CMake

Как должен выглядеть мой файл 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}
)

Ответ 1

В 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

Ниже приведена моя конфигурация:

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

Ответ 3

Какая библиотека Boost? Многие из них являются чистыми шаблонами и не требуют связывания.

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

  • установите libboost-program-options-dev, чтобы вы могли ссылаться на него
  • сообщить cmake ссылку на libboost_program_options

В основном я использую Makefile, поэтому прямое использование командной строки:

$ 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.

Ответ 4

Адаптация ответа @MOnsDaR для современного синтаксиса CMake с импортированными целями:

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

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