আপনি কীভাবে CMakeLists.txt এ বুস্ট লাইব্রেরি যুক্ত করবেন?


124

আমাকে আমার সিএমকেলিস্ট.টেক্সটে বুস্ট লাইব্রেরি যুক্ত করতে হবে। আপনি এটি কীভাবে করবেন বা কীভাবে এটি যুক্ত করবেন?


এই লাইনটি রসবিল্ড_এডডি_ বুস্ট_ডাইরেক্টরিজ () কী করে?
লক্ষ

অফিসিয়াল ডকুমেন্টেশন এখানে দেখুন
অ্যাডেম

উত্তর:


171

এটি আপনার CMakeLists.txtফাইলে রাখুন (আপনি চাইলে অফ থেকে কোনও বিকল্প পরিবর্তন করুন):

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON)  
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost 1.45.0 COMPONENTS *boost libraries here*) 

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS}) 
    add_executable(progname file1.cxx file2.cxx) 
    target_link_libraries(progname ${Boost_LIBRARIES})
endif()

স্পষ্টতই আপনার যে লাইব্রেরিগুলি আপনি চান সেখানে রাখার দরকার যেখানে আমি রেখেছি *boost libraries here*। উদাহরণস্বরূপ, আপনি যদি লিখতে filesystemএবং regexগ্রন্থাগারটি ব্যবহার করে থাকেন:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

2
মনে রাখবেন যে আপনাকে কেবল শিরোনামের গ্রন্থাগারগুলির জন্য উপাদানগুলি নির্দিষ্ট করার দরকার নেই lexical_cast। সুতরাং আপনি কেবল আদেশ find_packageএবং include_directoriesআদেশ প্রয়োজন ।
মিগুয়েল.মার্টিন

1
Windows এ, এটি সাহায্যের এই আপনার cmake ফাইল যোগ করতে পারেন: ADD_DEFINITIONS (-DBOOST_ALL_NO_LIB) অন্যথায় আপনি পরতে পারেন stackoverflow.com/questions/28887680/...
Stéphane

BOOST_USE_STATIC_LIBS কে চালু এবং বুস্ট_ইউএসটিএসটিআইসি_আর্টটাইম অফে সেট করা সম্ভব? & বিপরীত.
স্কুইড

5
কী *boost libraries here*মানে?
ইগোরগানাপলস্কি

2
আপনি ব্যবহার করতে FIND_PACKAGE(Boost REQUIRED COMPONENTS system)বুস্টের সঠিক সংস্করণটি না জানলে
আপনিও

78

উপলভ্য বুস্ট লাইব্রেরিগুলির জন্য অনুসন্ধান করতে আপনি find_package ব্যবহার করতে পারেন । এটি বুস্ট টু ফাইন্ডবূস্ট.কমকে সন্ধান পিছিয়ে দেয় যা সিএমকেকের সাথে ডিফল্ট ইনস্টলড।

বুস্টকে খুঁজে পাওয়ার পরে, find_package()কলটিতে অনেকগুলি ভেরিয়েবল পূর্ণ হবে ( FindBoost.cmake এর জন্য রেফারেন্সটি পরীক্ষা করুন )। এর মধ্যে রয়েছে BOOST_INCLUDE_DIRS, বুস্ট_লিবিআরআইএস এবং বুস্ট_এক্সএক্সএক্সএক্স_লিবিআরএর ভেরিয়েবেলগুলি, যার সাথে নির্দিষ্ট বুস্ট লাইব্রেরি দ্বারা XXX প্রতিস্থাপন করা হয়েছে। আপনাকে তা নির্দিষ্ট করার এই ব্যবহার করতে পারেন include_directories এবং target_link_libraries

উদাহরণস্বরূপ, ধরা যাক আপনার দরকার :: প্রোগ্রাম_পোশন এবং বুস্ট :: রেজেক্সের দরকার, আপনি এমন কিছু করবেন:

find_package( Boost REQUIRED COMPONENTS program_options regex )
include_directories( ${Boost_INCLUDE_DIRS} )
add_executable( run main.cpp ) # Example application based on main.cpp

# Alternatively you could use ${Boost_LIBRARIES} here.
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} )

কিছু সাধারণ টিপস:

  • অনুসন্ধান করার সময়, ফাইন্ডবুক পরিবেশের পরিবর্তনশীল $ ENV {BOOST_ROOT che পরীক্ষা করে} প্রয়োজনে Find_package কল করার আগে আপনি এই পরিবর্তনশীলটি সেট করতে পারেন।
  • যখন আপনার বুস্টের একাধিক বিল্ড-সংস্করণ রয়েছে (মাল্টি-থ্রেডড, স্ট্যাটিক, শেয়ার্ড, ইত্যাদি) আপনি Find_package কল করার আগে পছন্দসই কনফিগারেশন নির্দিষ্ট করতে পারেন। নিম্নলিখিত ভেরিয়েবল কিছু সেটিং দ্বারা এই রকম কোরো On: Boost_USE_STATIC_LIBS, Boost_USE_MULTITHREADED,Boost_USE_STATIC_RUNTIME
  • উইন্ডোতে বুস্ট অনুসন্ধান করার সময়, অটো-লিঙ্কিংয়ের সাথে যত্ন নিন। রেফারেন্সে "ভিজ্যুয়াল স্টুডিও ব্যবহারকারীদের জন্য নোট" পড়ুন ।
    • আমার পরামর্শটি হ'ল স্বয়ংক্রিয় লিঙ্কিং অক্ষম করুন এবং চক্রের নির্ভরতা হ্যান্ডলিংটি ব্যবহার করুন: add_definitions( -DBOOST_ALL_NO_LIB )
    • কিছু ক্ষেত্রে, আপনার স্পষ্টভাবে উল্লেখ করতে হবে যে ডায়নামিক বুস্ট ব্যবহৃত হয়েছে: add_definitions( -DBOOST_ALL_DYN_LINK )

3
সাধারণ টিপস জন্য আপনাকে ধন্যবাদ। তারা আমাকে অনেক সাহায্য করেছিল।
টাইলার লং

অবিশ্বাস্যভাবে সহায়ক উত্তর! দু'বছর আগে যদি আমি এটি পাই তবে আমাকে অনেক সময় বাঁচাতে পারত। দুর্দান্ত লেখার আপ।
Ela782

22

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

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON)  
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost 1.45.0 COMPONENTS filesystem regex) 

if(Boost_FOUND)
    add_executable(progname file1.cxx file2.cxx) 
    target_link_libraries(progname Boost::filesystem Boost::regex)
endif()

নোট করুন যে অন্তর্ভুক্ত ডিরেক্টরিগুলি ম্যানুয়ালি নির্দিষ্ট করার দরকার নেই, কারণ এটি ইতিমধ্যে আমদানি করা লক্ষ্যগুলি Boost::filesystemএবং এর মাধ্যমে যত্ন নেওয়া হয়েছে Boost::regex
regexএবং filesystemআপনার প্রয়োজনীয় কোনও বুস্ট লাইব্রেরি দ্বারা প্রতিস্থাপন করা যেতে পারে।


1
আপনি সমস্ত উত্সাহের সাথে লিঙ্ক করতে বলতে চাইলে এই চেহারাটি কেমন হবে? আমি বলতে চাইছি সেখানে সমস্ত লাইব্রেরি তালিকাভুক্ত না করেই পদোন্নতি রয়েছে।
টবি ব্রল

4
আপনি যদি কেবলমাত্র বুস্টের হেডার-কেবলমাত্র অংশগুলি ব্যবহার করেন তবে 'বুস্ট :: বুস্ট' যথেষ্ট হবে। সমস্ত সংকলিত বুস্ট গ্রন্থাগারগুলি অবশ্যই স্পষ্টভাবে নির্দিষ্ট করতে হবে।
ওলেন

2
@ ওলেন আমি কোথায় সমস্ত আমদানিকৃত ক্যামকে বুস্ট :: * টার্গেটের একটি তালিকা পাই? যার সাথে আমার লিঙ্ক করতে হবে তা আমি কীভাবে জানব?
মার্কাস

8

এটি কিছু লোকের পক্ষে সহায়ক হতে পারে। আমার একটি দুষ্টু ত্রুটি ছিল: '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: প্রতীক যুক্ত করার সময় ত্রুটিযুক্ত ডিএসও নিখোঁজ ছিল cmakeList.txt এর কিছু সমস্যা ছিল There এবং আমি কোনওভাবে স্পষ্টভাবে "সিস্টেম" এবং "ফাইল সিস্টেম" লাইব্রেরি অন্তর্ভুক্ত করতে অনুপস্থিত ছিলাম। সুতরাং, আমি এই লাইনগুলি CMakeLists.txt এ লিখেছি

এই লাইনগুলি প্রজেক্টের এক্সিকিউটেবল তৈরির আগে শুরুতে লেখা হয়েছিল, যেমন এই পর্যায়ে আমাদের বুস্ট লাইব্রেরিটিকে আমাদের প্রকল্পের এক্সিকিউটেবলের সাথে সংযুক্ত করার দরকার নেই।

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON)  
set(Boost_USE_STATIC_RUNTIME OFF) 
set(Boost_NO_SYSTEM_PATHS TRUE) 

if (Boost_NO_SYSTEM_PATHS)
  set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
  set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
  set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
endif (Boost_NO_SYSTEM_PATHS)


find_package(Boost COMPONENTS regex date_time system filesystem thread graph program_options) 

find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
find_package(Boost COMPONENTS program_options REQUIRED)

এখন ফাইলটির শেষে, আমি "কী-পয়েন্ট-মূল্যায়ন "টিকে আমার প্রকল্পের নির্বাহযোগ্য হিসাবে বিবেচনা করে এই লাইনগুলি লিখেছিলাম।

if(Boost_FOUND)
    include_directories(${BOOST_INCLUDE_DIRS})
    link_directories(${Boost_LIBRARY_DIRS})
    add_definitions(${Boost_DEFINITIONS})

    include_directories(${Boost_INCLUDE_DIRS})  
    target_link_libraries(KeyPointEvaluation ${Boost_LIBRARIES})
    target_link_libraries( KeyPointEvaluation ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY})
endif()

2

আমি উত্তর 1 এবং 2 সাথে একমত । যাইহোক, আমি প্রতিটি লাইব্রেরি পৃথকভাবে নির্দিষ্ট করতে পছন্দ করি। এটি বড় প্রকল্পগুলিতে ডিপেন্সেন্সিকে আরও পরিষ্কার করে তোলে। তবুও, (কেস-সংবেদনশীল) ভেরিয়েবলের নামগুলি ভুল টাইপ করার আশঙ্কা রয়েছে। সেক্ষেত্রে কোনও সরাসরি চ্যামেক ত্রুটি নেই তবে পরে কিছু অপরিজ্ঞাত রেফারেন্স লিংকার সম্পর্কিত সমস্যা রয়েছে যা সমাধানে কিছুটা সময় নিতে পারে। অতএব আমি নিম্নলিখিত cmake ফাংশন ব্যবহার:

function(VerifyVarDefined)
  foreach(lib ${ARGV}) 
    if(DEFINED ${lib})
    else(DEFINED ${lib})
      message(SEND_ERROR "Variable ${lib} is not defined")
    endif(DEFINED ${lib})
  endforeach()
endfunction(VerifyVarDefined)

উপরে উল্লিখিত উদাহরণের জন্য, এটির মতো দেখাচ্ছে:

VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARY Boost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} )

আমি যদি "BOOST_PROGRAM_OPTIONS_LIBRARY" লিখে থাকি তবে cmake দ্বারা একটি ত্রুটি ঘটত এবং লিংককারী দ্বারা পরে আর ট্রিগার করা হত না।


2

বুস্ট ডকুমেন্টেশন বলার চেষ্টা করুন :

set(Boost_USE_STATIC_LIBS        ON)  # only find static libs
set(Boost_USE_DEBUG_LIBS         OFF) # ignore debug libs and 
set(Boost_USE_RELEASE_LIBS       ON)  # only find release libs 
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF) 
find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)   
    include_directories(${Boost_INCLUDE_DIRS})
    add_executable(foo foo.cc)   
    target_link_libraries(foo ${Boost_LIBRARIES})
endif()

আপনার প্রকল্পের নাম এবং উপাদানগুলিতে ফু প্রতিস্থাপন করতে ভুলবেন না!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.