CMake를 사용하여 C ++ 프로그램을 Boost와 연결하는 방법


109

내 프로그램을 Ubuntu에서 Boost 라이브러리와 연결하려면 내 CMake 파일이 어떻게 표시되어야합니까?

실행 중 표시되는 오류 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.cmakeCMake 설치와 함께 있습니다.

내가 기억하는 한, /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 저장소에서 작업 링크를 추가했습니다. 또한 FindBoost.cmake에 대한 공식 문서에 대한 링크를 추가했습니다
MOnsDaR

1
특히 Boost 1.40이 필요한 이유는 무엇입니까? 라이브러리의 기본 기능이 언제 변경되지 않았습니까?
jgyou

6
왜 안 되니? 그것은 단지 예일뿐입니다. 가장 적합한 것을 입력하십시오
MOnsDaR

5
중요한 세부 사항 배치하는 것입니다 target_link_libraries add_executable 하고 find_package , 라인 때문에 연결된 모든 구성 요소가 알려져있다.
Murphy

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
Boost_LIBRARIES는 정규화 된 경로이므로 link_directories는 필요하지 않습니다.
RobertJMaynard 2014-06-09

제 경우에는 link_directories가 필요했습니다.
mgruber4

25

가져온 대상이있는 최신 CMake 구문에 @MOnsDaR 답변을 적용하면 다음과 같습니다.

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 (brew의 최신 복사본)에서 여전히 오류가 발생합니다.
Henry Schreiner

4
오래된 답변이 너무 많아서 올바른 답변 (이 답변)을 찾기가 어렵 기 때문에 stackoverflow가 실패하기 시작합니다.
Carlo Wood

3

어떤 Boost 라이브러리? 대부분은 순수한 템플릿이며 링크가 필요하지 않습니다.

이제 Boost 프로그램 옵션을 원한다는 것을 알려주는 구체적인 예제가 실제로 표시되었으므로 (우분투에 있다고 더 많이 알려줍니다) 두 가지 작업을 수행해야합니다.

  1. libboost-program-options-dev링크 할 수 있도록 설치 하십시오.
  2. 에게 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.


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

위의 디렉토리 /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 오류를 제공합니다.-CMakeLists.txt : 102에서 완료 CMake 오류 구성 (add_executable) : 대상 "DB32"가 대상 "Boost :: program_options"에 연결되지만 대상을 찾을 수 없습니다. . IMPORTED 대상에 대해 find_package () 호출이 누락되었거나 ALIAS 대상이 누락 되었습니까?
munsingh

안녕하세요, 의견을 보내 주셔서 감사합니다. CMake가 시스템에서 Boost를 찾을 수없는 것 같습니다. 소스에서 Boost의 새로운 빌드를 만드는 것이 좋습니다. 그 전에 다음을 시도해 볼 수 있습니다.find_package(Boost QUIET REQUIRED) 대상 (DB32) 링크합니다.target_link_libraries(DB32 PUBLIC Boost::headers)
adem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.