2011-06-14 17 views
8

मेरे पास स्रोत निर्देशिका में कई स्रोत फ़ाइलें हैं। उदाहरण के लिए a.c, b.c, c.c और gcc द्वारा -combine विकल्प के साथ इसे संकलित करना चाहते हैं।सीएमके और जीसीसी गठबंधन

set(CMAKE_C_FLAGS "-combine") 
set(SRC a.c b.c c.c) 
add_executable(a.out ${SRC}) 

सीएमके ऑब्जेक्ट फ़ाइल में प्रत्येक * .c फ़ाइल संकलित करता है, लेकिन मैं सभी स्रोतों को एक ऑब्जेक्ट में संकलित करना चाहता हूं। मैं इसे कैसे प्राप्त कर सकता हूं।

जीसीसी के संदर्भ में:

gcc -combine a.c b.c c.c -o module.o 
ar rcs library.a module.o 

लेकिन cmake प्रति-मॉड्यूल के सूत्रों के अनुवाद का उपयोग करता है।

gcc a.c -o a.o 
gcc b.c -o b.o 
gcc c.c -o c.o 
ar rcs library.a a.o b.o c.o 

संयोजन के साथ अनुवाद प्रोग्राम के प्रदर्शन को तेज कर सकता है। मैं एलटीओ का उपयोग नहीं कर सका जो जीसीसी के पुराने संस्करण के कारण सेमेक में एक ही समस्या का समाधान कर सकता था।

धन्यवाद।

+0

क्या आप सुनिश्चित हैं कि एक विकल्प '-combine' मौजूद है? मुझे एहसास है कि यह वह नहीं है जिसे आप करने की कोशिश कर रहे हैं। हो सकता है कि आपका मतलब '-फहोल-प्रोग्राम' है, जो नैतिक रूप से आपके सभी स्रोत फ़ाइलों को एकसाथ समेकित करने के बराबर है। लेकिन अधिक संभावना है कि आप बस एक पुन: प्रयोज्य पुस्तकालय बनाने की कोशिश कर रहे हैं। गतिशील लाइब्रेरी बनाने के लिए '-shared' का उपयोग करें, या केवल 'ar' प्रोग्राम को एक स्थिर लाइब्रेरी में' .o' फ़ाइलों को गठबंधन करने के लिए उपयोग करें। सीएमके आपके लिए दोनों को स्वचालित कर सकता है। –

+2

हाँ, मुझे यकीन है। यह विकल्प जीसीसी संस्करण 4.4/4.5 –

+0

में मौजूद है दिलचस्प, यह 4.6 में गायब हो गया! :-) इसका उद्देश्य क्या है? कुछ भी जो आप '-फहोल-प्रोग्राम' के साथ प्राप्त नहीं कर सकते? –

उत्तर

1

add_custom_target/add_custom_command का उपयोग करें।

किसी भी तरह से यह यह [स्रोत] में दो फ़ोल्डर्स के साथ गैर पोर्टेबल निर्माण, इसलिए यहाँ सरल उदाहरण

[परियोजना जड़] है - यहाँ एन फ़ाइलें, [निर्माण] द्विआधारी के लिए, और CMakeLists.txt

cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR) 
set(TARGET_NAME whole) 
project(${TARGET_NAME} C) 

file(GLOB SRC_FILES src/*.c) 

add_custom_target(${TARGET_NAME} ${CMAKE_C_COMPILER} -flto -fwhole-program ${SRC_FILES} -o ${TARGET_NAME}) 

बिल्ड फ़ोल्डर में cmake चलाएं ..; VERBOSE = 1 पूरे

यह आपके लिए काम करेगा।

लेकिन, -फहोल-प्रोग्राम documentation के अनुसार केवल निष्पादन योग्य के साथ काम करता है।

-fwhole-कार्यक्रम मान लें कि वर्तमान संकलन इकाई पूरे कार्यक्रम का प्रतिनिधित्व करता है संकलित किया जा रहा। मुख्य के अपवाद के साथ सभी सार्वजनिक कार्यों और चर और बाहरी रूप से विशेषता वाले गुणों द्वारा विलय किए गए स्थिर कार्य बन जाते हैं और असल में इंटरप्रोसेडुरल ऑप्टिमाइज़र द्वारा अधिक आक्रामक रूप से अनुकूलित किए जाते हैं।

तो आप अपनी स्रोत फ़ाइलों में कहीं भी मुख्य रूप से परिभाषित हैं।