আমাকে আমার সিএমকেলিস্ট.টেক্সটে বুস্ট লাইব্রেরি যুক্ত করতে হবে। আপনি এটি কীভাবে করবেন বা কীভাবে এটি যুক্ত করবেন?
আমাকে আমার সিএমকেলিস্ট.টেক্সটে বুস্ট লাইব্রেরি যুক্ত করতে হবে। আপনি এটি কীভাবে করবেন বা কীভাবে এটি যুক্ত করবেন?
উত্তর:
এটি আপনার 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)
lexical_cast
। সুতরাং আপনি কেবল আদেশ find_package
এবং include_directories
আদেশ প্রয়োজন ।
*boost libraries here*
মানে?
FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
বুস্টের সঠিক সংস্করণটি না জানলে
উপলভ্য বুস্ট লাইব্রেরিগুলির জন্য অনুসন্ধান করতে আপনি 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} )
কিছু সাধারণ টিপস:
On
: Boost_USE_STATIC_LIBS
, Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
আমদানিকৃত টার্গেট সহ আধুনিক লেনেক সিনট্যাক্সের জন্য @ লাইনআইওয়াকুরার উত্তরটি মানিয়ে নেওয়া, এটি হবে:
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
আপনার প্রয়োজনীয় কোনও বুস্ট লাইব্রেরি দ্বারা প্রতিস্থাপন করা যেতে পারে।
এটি কিছু লোকের পক্ষে সহায়ক হতে পারে। আমার একটি দুষ্টু ত্রুটি ছিল: '_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()
আমি উত্তর 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 দ্বারা একটি ত্রুটি ঘটত এবং লিংককারী দ্বারা পরে আর ট্রিগার করা হত না।
বুস্ট ডকুমেন্টেশন বলার চেষ্টা করুন :
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()
আপনার প্রকল্পের নাম এবং উপাদানগুলিতে ফু প্রতিস্থাপন করতে ভুলবেন না!