Как связать программу C ++ с Boost, используя CMake - PullRequest
96 голосов
/ 10 октября 2010

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

Ответы [ 5 ]

133 голосов
/ 12 октября 2010

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

Надеюсь, этот код поможет.

47 голосов
/ 28 июня 2011

Следующая моя конфигурация:

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} )
17 голосов
/ 10 мая 2017

Адаптируя ответ @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.

4 голосов
/ 10 октября 2010

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

Теперь, когда на самом деле показан конкретный пример, который говорит нам о том, что вам нужны параметры программы 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.

2 голосов
/ 04 августа 2018

Два способа, используя системный путь установки по умолчанию, обычно /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}
        )

Обратите внимание, что вышеупомянутый каталог /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? .

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