-FPIC সংকলক বিকল্পটি যুক্ত করতে CMAKE এর অলঙ্কৃত উপায় কী?


119

আমি এটি করার জন্য কমপক্ষে 3 টি উপায় নিয়ে এসেছি এবং আমি ভাবছি যা হ'ল প্রতিমাটি। এটি কোনও স্ট্যাটিক লাইব্রেরিতে প্রায় সর্বজনীনভাবে করা দরকার। আমি আশ্চর্য হয়েছি যে সিএমকেমে মেকফাইল জেনারেটর স্বয়ংক্রিয়ভাবে এটি স্ট্যাটিক লাইব্রেরিতে যুক্ত করে না। (যদি না আমি কিছু মিস করছি?)

target_compile_options(myLib PRIVATE -fPIC)

add_compile_options(-fPIC)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")

আমি বিশ্বাস করি এর অন্যান্য বিভিন্নতাও থাকতে পারে। (আপনি যদি একটি প্রশ্ন পান তবে আমার প্রশ্নটি সম্পাদনা করুন)

আপনি যদি এই প্রশ্নের উত্তর জানতেই পারেন, আপনি কি এটাও জানেন যে কোনও তৃতীয় পক্ষের সিএমকে প্রকল্পের সিএমকেলিস্ট.টিএসটিএসটি ফাইল পরিবর্তন না করে এই পতাকাটি সংকলিত করার কোনও উপায় আছে কিনা? আমি স্থিত লাইব্রেরি জুড়ে চালিয়েছি যে পতাকাটি অনুপস্থিত। স্থির গ্রন্থাগারকে একটি গতিশীল লাইব্রেরিতে সংকলন করার সময় এটি সমস্যার সৃষ্টি করে।

তুমি পাও:

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

এটি set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")আমার জন্য কাজ করেছে।
ব্যারাকুদা

উত্তর:


179

আপনি সমস্ত লক্ষ্যবস্তুতে অবস্থানের স্বাধীন কোড সম্পত্তি সেট করতে পারেন:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

বা একটি নির্দিষ্ট গ্রন্থাগারে:

add_library(lib1 lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)

তথ্যসূত্র: CMAKE_POSITION_INDEPENDENT_CODE cmake বিল্ড সিস্টেম


দ্বিতীয় পদ্ধতিটি এটি একটি তৃতীয় পক্ষের lib এ যুক্ত করার সঠিক উপায় বলে মনে হয়। পারফেক্ট।
010110110101

এইচআরএম - আমি ভাবছি আপনি কীভাবে এটি এক্সটার্নালপ্রজেক্ট_এড যুক্ত একটি প্রকল্পে যুক্ত করবেন?
010110110101

2
@ 010110110101 আমি জানি না এটি কাজ করে কিনা তবে আপনি এক্সটার্নাল প্রজেক্ট_এ বিকল্পের সাথে উল্লেখ করার চেষ্টা করতে পারেনCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus

12
CMAKE_POSITION_INDEPENDENT_CODEসম্পত্তি জন্য ডিফল্ট সেট করা হয় SHAREDলক্ষ্যমাত্রা, এটা স্পষ্টভাবে সেট করতে কোন প্রয়োজন নেই।
রবার্ট

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