সিএমকে ব্যবহার করে বুস্টের সাথে সি ++ প্রোগ্রামটি কীভাবে যুক্ত করা যায়


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

সিএমকে 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 বুস্ট করবেন? কখন গ্রন্থাগারের বেস কার্যকারিতা পরিবর্তন বন্ধ?
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
লিংক_ডাইরেক্টরিগুলি বুস্ট_লিবিআরএআরআইএস সম্পূর্ণরূপে যোগ্য পাথ হিসাবে প্রয়োজনীয় নয়।
রবার্টজেমিনার্ড

আমার ক্ষেত্রে লিঙ্ক_ ডিরেক্টরিগুলি প্রয়োজনীয় ছিল।
এমজিগ্রুবার 4

25

আমদানি করা টার্গেট সহ আধুনিক সিএমেক সিনট্যাক্সের জন্য @ এমএনএসডিআর উত্তরটি মানিয়ে নেওয়া, এটি হবে:

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

নোট করুন যে অন্তর্ভুক্ত ডিরেক্টরিগুলি ম্যানুয়ালি উল্লেখ করার প্রয়োজন নেই, কারণ এটি ইতিমধ্যে আমদানীকৃত টার্গেটের মাধ্যমে যত্ন নেওয়া হয়েছে Boost::program_options


এই টার্গেট পদ্ধতির খারাপ দিকটি হ'ল যদি আপনার বুস্ট সংস্করণটি আপনার সিএমকে সংস্করণের চেয়ে নতুন হয় তবে সম্ভবত এটি ব্যর্থ হবে। The FindBoost.cmakeমূলত এগুলি কেবল তখনই তৈরি করে যদি এটি আপনার বুস্ট সংস্করণটিকে স্পষ্টভাবে তালিকাবদ্ধ করে। এক পর্যায়ে এটি উন্নত হওয়ার কথা ছিল, তবে আমি এখনও সিএমকে ৩.১০.২ এবং বুস্ট ১.66। (ব্রিউ থেকে নতুন কপি) দিয়ে ব্যর্থতা দেখছি।
হেনরি শ্রেইনার

4
স্ট্যাকওভারফ্লো ব্যর্থ হতে শুরু করে কারণ প্রচুর পুরানো উত্তর রয়েছে যা প্রায়শই সঠিক উত্তর (এটির উত্তর) খুঁজে পাওয়া শক্ত।
কার্লো উড

3

কোন বুস্ট লাইব্রেরি? তাদের মধ্যে অনেকগুলি খাঁটি টেম্পলেট এবং লিঙ্কের প্রয়োজন হয় না।

এখন প্রকৃত প্রদর্শিত কংক্রিটের উদাহরণ সহ যা আমাদের বলছে যে আপনি বুস্ট প্রোগ্রামের বিকল্পগুলি চান (এবং আরও আমাদের জানান যে আপনি উবুন্টুতে আছেন), আপনাকে দুটি জিনিস করতে হবে:

  1. ইনস্টল করুন libboost-program-options-devযাতে আপনি এর বিপরীতে লিঙ্ক করতে পারেন।
  2. cmakeবিরুদ্ধে লিঙ্ক বলতে libboost_program_options

আমি বেশিরভাগ মেকফাইল ব্যবহার করি তাই এখানে সরাসরি কমান্ড-লাইন ব্যবহার রয়েছে:

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

এটা মনে হয় অনেক কিছুই না।

সিএমকেকের জন্য, আপনাকে লাইব্রেরির তালিকায় বুস্ট_প্রগ্রাম_অপশন যুক্ত করতে হবে এবং আইআইআরসি এটি SET(liblist boost_program_options)আপনার মাধ্যমে করা হয় CMakeLists.txt


11
আপনার সিএমকে পরামর্শটি ভুল (গ্রহণযোগ্য উত্তর দেখুন), এবং আপনার কমান্ডলাইন পরামর্শটি খুব কার্যকর নয় কারণ প্রশ্নটি সিএমকেকে নিয়ে ছিল।
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}
        )

আপনি যদি কোনও স্থানীয় ডিরেক্টরিতে বুস্ট ইনস্টল করেন বা সিস্টেম ইনস্টলের পরিবর্তে স্থানীয় ইনস্টল চয়ন করেন তবে আপনি এটি দ্বারা এটি করতে পারেন:

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)

টার্গেট_লিংক_লাইব্রিজ (হেলোরল্ড পাবলিক বুস্ট :: প্রোগ্রাম_অপশনস) একটি সিএমএকে ত্রুটি দেবে: - সিএমকেলিস্ট.টেক্সট: ১০২ (add_executable) এ সম্পন্ন সিএমকে ত্রুটিটি কনফিগার করছে: "Boost :: program_options" টার্গেটের জন্য "DB32" লিঙ্ক রয়েছে তবে লক্ষ্য খুঁজে পাওয়া যায় নি । সম্ভবত একটি ইমপোর্টেটড টার্গেটের জন্য একটি ফাইন্ডপ্যাকেজ () কল অনুপস্থিত, বা একটি ALIAS লক্ষ্য অনুপস্থিত?
মুনসিংহ

হাই, প্রতিক্রিয়ার জন্য ধন্যবাদ। দেখে মনে হচ্ছে সিএমকে আপনার সিস্টেমে বুস্টকে সনাক্ত করতে পারে না। উত্স থেকে বুস্টকে নতুন করে তৈরি করা ভাল। তার আগে আপনাকে নিম্নলিখিত চেষ্টা করতে পারেন: সঙ্গে প্যাকেজ খুঁজুন find_package(Boost QUIET REQUIRED): আপনার টার্গেট (DB32) এর এবং লিঙ্কtarget_link_libraries(DB32 PUBLIC Boost::headers)
adem
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.