cmake

2013-01-15 65 views
9

का उपयोग कर विशिष्ट स्थानों में कंपाइलर कमांड लाइन तर्क कैसे डालें, इसलिए मैं दो स्थैतिक पुस्तकालयों में से एक साझा लाइब्रेरी का निर्माण कर रहा हूं।cmake

This answer यह कहने का तरीका है कि मेरे स्थिर libs से पहले -Wl,--no-whole-archive-Wl,--whole-archive डालने का तरीका है।

तो क्या मैं साझा लाइब्रेरी के लिए इस समय cmake में है:

add_library(wittyPlus SHARED empty.cpp) 
target_link_libraries(wittyPlus 
    ${wtdbosqlite} 
    ${WT_LIBRARIES} 
    ${DB_LIBRARIES} 
    ${Boost_LIBRARIES} 
    app models 
) 

तो मैं क्या जरूरत है यह उनके पीछे -Wl,--no-whole-archiveapp और models से पहले -Wl,--whole-archive जोड़ने के लिए है, तो (ताकि है मानक पुस्तकालय आयात साझा lib द्वारा निर्यात नहीं किया जाता है)।

सीएमके में ऐसा करने का सबसे आसान तरीका क्या है?


अलावा: तो मैं के रूप में ज्यादा संभव के रूप में मानक cmake सामान का उपयोग करना चाहते हैं, कि जिस तरह से मैं किसी भी अतिरिक्त काम खिड़कियों के लिए बनाता है, के रूप में CMake कृपया संकलक परिभाषाओं को हटा करने के लिए की जरूरत नहीं है जो प्लेटफार्म पर निर्मित नहीं हैं।

उत्तर

14

ठीक है, यह मैंने सोचा था जितना आसान था।

तो cmake docs के अनुसार: के साथ शुरू

मद के नाम '-' नहीं, बल्कि 'एल' या '-framework', लिंकर झंडे के रूप में इलाज कर रहे हैं।

तो ठीक बस के लिए गया था:

add_library(wittyPlus SHARED empty.cpp) 
target_link_libraries(wittyPlus 
    ${wtdbosqlite} 
    ${WT_LIBRARIES} 
    ${DB_LIBRARIES} 
    ${Boost_LIBRARIES} 
    "-Wl,--whole-archive" 
    app models 
    "-Wl,--no-whole-archive" 
) 

मैं अगर यह विंडोज़ पर काम करेंगे या नहीं, मैं उम्मीद यह होगा के रूप में cmake सुपर चालाक है पता नहीं है।

ओबजडम्प के साथ परिणाम देखकर, ऐसा लगता है कि निर्यात में बहुत सारी चीजें हैं, इसलिए मैं कुछ गलत कर रहा हूं।

objdump -C -t wittyPlus/libwittyPlus.so | grep -i boost 

लेकिन इसमें मेरे पास लिंक करने की आवश्यकता है, इसलिए यह एक कदम आगे है।

कोई अन्य उत्तर अभी भी सराहना की है।

CMake: how create a single shared library from all static libraries of subprojects?

+0

क्या आपको कोई ऐसा काम मिला है जिसके लिए शून्य 'खाली.cpp' फ़ाइल की आवश्यकता नहीं है? –

+0

नहीं, मैं हर समय blank.cpp का उपयोग करता हूं। – matiu

+3

मुझे लगता है कि आप फ़ाइल (WRITE खाली.cpp "") कर सकते हैं, यदि आप जंक फ़ाइलों के साथ अपने वास्तविक स्रोत पेड़ को प्रदूषित नहीं करना चाहते हैं। –

0

आप अपने आप को स्थिर पुस्तकालयों का निर्माण कर रहे हैं, तो आप इस दृष्टिकोण का उपयोग कर सकते हैं:: असल में मैं क्या करने की कोशिश कर रहा हूँ इस सवाल के समान ही है https://stackoverflow.com/a/29824424/4069571 अर्थात् पहली वस्तु पुस्तकालयों के रूप में उन्हें का निर्माण, तो जोड़ने उन्हें संबंधित साझा और स्थैतिक libs में।