-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")

मेरा मानना ​​है कि अन्य बदलाव भी हो सकते हैं। (अगर आपको एक मिल जाए तो कृपया मेरे प्रश्न को संपादित करें)

यदि आप इस प्रश्न का उत्तर जानते हैं, तो क्या आप यह भी जानते हैं कि क्या कोई पार्टी सीएमके प्रोजेक्ट को इस झंडे के साथ संकलित किए जाने का एक तरीका है, बिना इसकी CMakeLists.txt फ़ाइल को संशोधित किए? मैंने उस झंडे को याद करते हुए स्थिर पुस्तकालयों को चलाया है। यह एक स्थैतिक पुस्तकालय को गतिशील पुस्तकालय में संकलित करते समय समस्याओं का कारण बनता है।

आपको मिला:

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 सिस्टम का निर्माण


दूसरी विधि के रूप में अच्छी तरह से एक 3 पार्टी के लिए इसे जोड़ने के लिए सही तरीका प्रतीत होता है। उत्तम।
010110110101

हर्म - मुझे आश्चर्य है कि आप इसे बाह्यप्रोजेक्ट_डाउन द्वारा जोड़े गए प्रोजेक्ट में कैसे जोड़ेंगे?
010110110101

2
@ 010110110101 मुझे नहीं पता कि क्या यह काम करता है, लेकिन आप निर्दिष्ट करने की कोशिश कर सकते हैं, बाहरीProject_Add विकल्प के साथCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus

12
CMAKE_POSITION_INDEPENDENT_CODEसंपत्ति के लिए सेट किया जाता है SHAREDलक्ष्य, यह स्पष्ट रूप से स्थापित करने के लिए कोई जरूरत नहीं है।
रॉबर्ट

1
@ कार्बन यदि आप setकमांड का उपयोग कर रहे हैं (ऊपर पहला संस्करण), तो नहीं। यदि आप दूसरे संस्करण का उपयोग कर रहे हैं, तो यह लाइब्रेरी के अनुसार है, प्रति निर्देशिका नहीं।
patrickvacek
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.