উত্স ডিরেক্টরিতে স্থির গ্রন্থাগারে লিংক করতে আমি কীভাবে সিএমকে বলব?


96

আমার একটি মেকফিলের সাথে একটি ছোট প্রকল্প রয়েছে যা আমি সিএমকে রূপান্তর করার চেষ্টা করছি, বেশিরভাগই কেবল সিএমকেকের সাথে অভিজ্ঞতা অর্জনের জন্য। এই উদাহরণের উদ্দেশ্যে, প্রকল্পটিতে একটি উত্স ফাইল (সি ++, যদিও আমি মনে করি ভাষাটি বিশেষভাবে প্রাসঙ্গিক নয়) এবং একটি স্থির লাইব্রেরি ফাইল যা আমি অন্য কোথাও থেকে অনুলিপি করেছি। যুক্তির পক্ষে ধরে নিন যে গ্রন্থাগারের উত্স কোডটি উপলভ্য নয়; আমার কাছে কেবল .a ফাইল এবং সংশ্লিষ্ট শিরোনাম।

আমার হস্তনির্মিত মেকফিলটিতে এই বিল্ড রুলটি রয়েছে:

main: main.o libbingitup.a
    g++ -o main main.o libbingitup.a

যা ভাল কাজ করে। আমি কীভাবে সিএমকে বলি এটি পুনরুত্পাদন করতে? আক্ষরিকভাবে এই সঠিক মেকফিলটি নয়, তবে এমন কিছু যা সমতুল্য লিঙ্কিং কমান্ডকে অন্তর্ভুক্ত করে। আমি যেমন স্পষ্ট কিন্তু নির্লজ্জ উপায় চেষ্টা করেছি

add_executable(main main.cpp libbingitup.a)

বা

add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)

পাশাপাশি link_directories(.)বা অন্যান্য সহ বিভিন্ন জিনিস add_library(bingitup STATIC IMPORTED)তবে এখন পর্যন্ত এমন কিছু নেই যা সফল লিঙ্কেজের ফলস্বরূপ। আমার কী করা উচিত?


সংস্করণের বিবরণ: লিনাক্সে সিএমকে 2.8.7 (কুবুন্টু 12.04) জিসিসি 4.6.3 সহ 6

উত্তর:


121

লাইব্রেরিগুলিকে লিঙ্ক করার পুরো পথটি পাস করার পক্ষে সিএমকে পক্ষপাত রয়েছে, সুতরাং লিবিবইটআপ.এ অনুমান ${CMAKE_SOURCE_DIR}করে নিম্নলিখিত কাজগুলি সফল হওয়া উচিত:

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)

4
দুর্দান্ত, যে কাজ করে, ধন্যবাদ! এখানে পুরোপুরি সুস্পষ্টভাবে লিখতে হবে বলে মনে হচ্ছে কিছুটা হ্যাচিশ, তবে আমার ধারণা এটি কেবল সিএমকে উপায় ...
ডেভিড জেড

4
আমি সম্মত হই যে এটি এখানে ওভারকিলের মতো বলে মনে হচ্ছে, তবে আপনি যদি একই লিবটির একাধিক বিভিন্ন সংস্করণ ইনস্টল করেন তবে স্পষ্টভাবে পুরো পথটি নির্দিষ্ট করে লভ্যাংশ প্রদান করে।
ফ্রেজার

4
আশ্চর্যজনক, যথারীতি! আমার ক্ষেত্রে, স্ট্যাটিক লাইব্রেরির উপর নির্ভরশীল অন্য নির্মিত গতিশীল লাইব্রেরির উপর নির্ভর করে লাইব্রেরিগুলির একটি সমস্যা সমাধান করা হয়েছে: নির্ভরশীল পাঠাগারগুলিও এই স্থির লাইব্রেরির সাথে লিঙ্ক করার চেষ্টা করছিল।
আন্তোনিও

4
কীভাবে প্রধান অন্তর্ভুক্ত ডিরেক্টরিগুলি সম্পর্কে জানেন?
ম্যানুয়েলস্কিনিড 3 ই

4
আপনার ব্যবহার করতে হবে target_include_directoriesবা include_directories(এটি পূর্বনির্ধারিত উপায়টি আরও নির্দিষ্ট হিসাবে নির্দিষ্ট)।
ফ্রেজার 13

31

আপনি যদি পুরো পথটি অন্তর্ভুক্ত করতে না চান তবে আপনি এটি করতে পারেন

add_executable(main main.cpp)
target_link_libraries(main bingitup)

bingitup আপনি যদি সিএমকে প্রকল্পে স্থির গ্রন্থাগার তৈরি করেন তবে আপনি একই নামটি লক্ষ্য করবেন:

add_library(bingitup STATIC bingitup.cpp)

CMake স্বয়ংক্রিয়ভাবে যোগ করা libসামনে এবং .aলিনাক্স শেষে এবং .libWindows এ শেষে।

লাইব্রেরি যদি বাহ্যিক হয় তবে আপনি ব্যবহার করে লাইব্রেরিতে পাথ যোগ করতে চাইতে পারেন

link_directories(/path/to/libraries/)

4
এবং যদি একই নামের সাথে .a এবং .so ফাইল থাকে তবে আপনি কীভাবে উল্লেখ করেন আপনি এই ক্ষেত্রে .a বা .so এর সাথে লিঙ্ক করতে চান?
জর্জ

4
@ জর্জ: আপনি পারবেন না। আপনার যদি উভয় প্রকার উপস্থিত থাকে তবে আপনি যে ফাইলটির সাথে লিঙ্ক করতে চান তার পুরো নাম অন্তর্ভুক্ত করুন।
ক্রিস লুয়েংগো

21

আমি এটি সহায়ক বলে মনে করেছি ...

http://www.cmake.org/pipermail/cmake/2011- জুন/045222.html

তাদের উদাহরণ থেকে:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)

4
INCLUDE_DIRECTORIES সম্পর্কে কী?
kyb

4
এটি কেবল তখনই কাজ করে যদি লাইব্রেরি চতুর নির্মাণের অংশ হয় তবে বিদেশী এটি কাজ করে না
ইগেনফিল্ড

প্রশ্নটি বলে "প্রকল্পটিতে একটি উত্স ফাইল (সি ++ রয়েছে, যদিও আমি মনে করি ভাষাটি বিশেষভাবে প্রাসঙ্গিক নয়) এবং একটি স্থির লাইব্রেরি ফাইল যা আমি অন্য কোথাও থেকে অনুলিপি করেছি।"
স্টু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.