सीएमके का उपयोग करके बूस्ट के साथ सी ++ प्रोग्राम को कैसे लिंक करें


109

उबंटू के तहत बूस्ट लाइब्रेरी के साथ अपने कार्यक्रम को जोड़ने के लिए मेरी सीएमके फ़ाइल कैसी दिखनी चाहिए?

रनिंग के दौरान दिखाई गई त्रुटियाँ 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;
}

मैं ऐसा करने में कामयाब रहा हूं। केवल वही लाइनें जो मैंने अपने सीएमके फाइलों में जोड़ी हैं, वे थीं:

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)

जवाबों:


150

CMake में आप find_packageअपनी ज़रूरत के पुस्तकालयों को खोजने के लिए उपयोग कर सकते हैं । आमतौर पर FindBoost.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
कितेवारस गितुब रेपो से एक कामकाजी लिंक जोड़ा गया। इसके अलावा FindBoost.cmake
MOnsDaR

1
विशेष रूप से बूस्ट 1.40 क्यों? पुस्तकालय की आधार कार्यक्षमता कब बदलनी शुरू हुई?
21

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 पूरी तरह से योग्य पथ होंगे।
राबर्टजमैयार्ड

मेरे मामले में 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


इस टारगेट अप्रोच का नकारात्मक पक्ष यह है कि यदि आपका बूस्ट संस्करण आपके CMake संस्करण की तुलना में नया है, तो यह संभवतः विफल हो जाएगा। The FindBoost.cmakeमूल रूप से इन्हें केवल तभी बनाया जाता है जब यह आपके बूस्ट संस्करण को स्पष्ट रूप से सूचीबद्ध करता है। कुछ बिंदु पर यह सुधार किया जाना चाहिए था, लेकिन मैं अभी भी CMake 3.10.2 और बूस्ट 1.66 (काढ़ा के साथ नवीनतम प्रतियां) के साथ विफलताओं को देख रहा हूं।
हेनरी स्क्रिनर

4
स्टैकओवरफ़्लो विफल होने लगती है क्योंकि बहुत सारे पुराने उत्तर हैं कि अक्सर सही उत्तर (यह एक) खोजना मुश्किल है।
कार्लो वुड

3

कौन सी बूस्ट लाइब्रेरी? उनमें से कई शुद्ध टेम्पलेट हैं और लिंकिंग की आवश्यकता नहीं है।

अब इसके साथ वास्तव में ठोस उदाहरण दिखाया गया है जो हमें बताता है कि आप बूस्ट प्रोग्राम विकल्प चाहते हैं (और हमें यह भी बताया कि आप उबंटू में हैं), आपको दो काम करने की जरूरत है:

  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 के बारे में था।
इला .२

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

यदि आप किसी स्थानीय निर्देशिका में बूस्ट इंस्टॉल करते हैं या सिस्टम इंस्टॉल के बजाय स्थानीय इंस्टॉल चुनते हैं, तो आप इसे इसके द्वारा कर सकते हैं:

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/मैं बूस्ट कहां स्थापित कर रहा हूं:

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/

यदि आप एक स्थानीय स्थापित बूस्ट का उपयोग करने में रुचि रखते हैं, तो आप इस प्रश्न को देख सकते हैं कि मैं अपने वैकल्पिक बूस्ट इंस्टॉलेशन को खोजने के लिए सीएमके कैसे प्राप्त कर सकता हूं?


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)

लक्ष्य_लिंक_ लाइब्रेरी (हेलोवर्ल्ड पब्लिक Boost :: program_options) एक CMAKE त्रुटि देगा: - CMakeLists.txt में 102 पर सीएमके त्रुटि कॉन्फ़िगर करना: (add_executable): लक्ष्य "DB32" लिंक "Boost :: program_options" को लक्षित करें, लेकिन लक्ष्य नहीं मिला। । शायद एक खोज_ पैकेज () कॉल एक महत्वपूर्ण लक्ष्य के लिए गायब है, या एक ALIAS लक्ष्य गायब है?
मुनसिंह

नमस्ते, प्रतिक्रिया के लिए धन्यवाद। ऐसा लगता है कि सीएमके आपके सिस्टम पर बूस्ट का पता नहीं लगा सकता है। हो सकता है कि आप स्रोत से बूस्ट का एक ताजा निर्माण करने के लिए बेहतर हों। इससे पहले कि आप निम्नलिखित का प्रयास करना चाहें: find_package(Boost QUIET REQUIRED)अपने लक्ष्य के साथ पैकेज और लिंक का पता लगाएं (DB32):target_link_libraries(DB32 PUBLIC Boost::headers)
adem
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.