2016-07-10 4 views
23

मैं ऐसा करने के कम से कम 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 

उत्तर

47

आप सभी लक्ष्यों पर स्थिति स्वतंत्र कोड गुण सेट कर सकते हैं:

set(CMAKE_POSITION_INDEPENDENT_CODE ON) 

या एक विशिष्ट पुस्तकालय में:

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

संदर्भ: CMAKE_POSITION_INDEPENDENT_CODEcmake build system

+0

दूसरी विधि इसे तृतीय पक्ष lib में जोड़ने का सही तरीका प्रतीत होता है। उत्तम। – 010110110101

+0

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

+1

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

संबंधित मुद्दे