2012-03-26 13 views
18

पर सी ++ में ओपनसीवी कोड को संकलित करने के लिए मेकफ़ाइल Learning OpenCV पुस्तक का उपयोग कर ओपनसीवी सीख रहा हूं।उबंटू/लिनक्स

कोड को संकलित करते समय मुझे एक समस्या का सामना करना पड़ रहा है कि मुझे संकलन करने और निष्पादन योग्य प्राप्त करने के लिए एक लंबा आदेश लिखना है।

यह आदेश मैं

g++ `pkg-config –cflags opencv` file_name.cpp -o output_file `pkg-config –libs opencv` 

का उपयोग कर रहा है मुझे कोई विशेषज्ञ बनाओ हूँ, लेकिन मुझे लगता है कि मैं लिख रहा है कि लंबे समय से आदेश बनाने का उपयोग कर समाप्त कर सकते हैं। इससे पहले मुझे अपने काम के प्रवाह की व्याख्या करनी चाहिए। मैंने अपनी होम निर्देशिका (~/opencv/) में opencv नामक एक निर्देशिका बनाई है। मैं अनुभाग द्वारा पुस्तक अनुभाग पढ़ रहा हूं और उस निर्देशिका में नए सीपीपी स्रोत कोड फ़ाइलों में उदाहरणों या अभ्यासों को कोडिंग कर रहा हूं। इसलिए मुझे हाथ से पहले फाइलों के नाम नहीं पता हैं।

अब मुझे क्या करना है बनाना चाहते हैं,

मान लीजिए मैं एक नया मेरा opencv निर्देशिका में facedetect.cpp नामक फ़ाइल कोड किया है, और इस

make facedetect 

तो मैं करना चाहते हैं की तरह बनाने के अगर मैं फोन मेरे लिए निम्न आदेश निष्पादित करने के लिए

g++ `pkg-config --cflags opencv` facedetect.cpp -o facedetect `pkg-config --libs opencv` 

ताकि जब भी मैं abc.cpp नाम की एक नई फ़ाइल बनाउंगा, तो मैं exe प्यारा make abc ताकि मैं अपने आदेश पंक्ति पर

$ ./abc 

चला सकते हैं मेरी abc.cpp परीक्षण करने के लिए

दें कि फ़ाइल बनाने के लिए इतना है कि मैं हर बार टाइपिंग कि लंबे समय आदेश की हताशा में सहेज सकते हैं।

पुनश्च: मैं इस पर मदद के लिए Google पर और CMake के प्रयोग पर this पाया, लेकिन मैं नहीं समझ सकता है कि क्या करता है। कृपया यह भी समझाएं कि मैं उसी कार्य के लिए सीएमके का उपयोग कैसे कर सकता हूं।

CFLAGS = $SHELL(pkg-config --cflags opencv) 
LIBS = $SHELL(pkg-config --libs opencv) 

facedetect : facedetect.cpp 
    g++ $(CFLAGS) $(LIBS) -o [email protected] $< 

फिर जब आप संकलित करने के लिए चाहते हैं तो आप सिर्फ टाइप करें::

उत्तर

22

आप एक फ़ाइल बना सकते हैं Makefile कहा जाता है आप इस तरह निर्देशिका काम करने में:

CFLAGS = `pkg-config --cflags opencv` 
LIBS = `pkg-config --libs opencv` 

% : %.cpp 
     g++ $(CFLAGS) $(LIBS) -o [email protected] $< 

तो आप अपने सभी एकल फ़ाइल programms के लिए इस फ़ाइल का उपयोग कर सकते हैं।फ़ाइल के बेसनाम के साथ बस make पर कॉल करें जिसे आप संकलित करना चाहते हैं।

एक makefile का सामान्य प्रारूप इस तरह है::

target : dependecy1 dependenc2 ... 
    command that generates the target 

तो अपने उदाहरण के लिए आप लिख सकते हैं:

facedetect : facedetect.cpp 
    g++ $(CFLAGS) $(LIBS) -o facedetect facedetect.cpp 
facedetect.cpp के लिए कि

make facedetect 

यहां कुछ और जानकारी होगी

प्रत्येक नए उदाहरण के लिए अब आप एक नया लक्ष्य बना सकते हैं। लेकिन क्या आप भी यह अधिक सामान्य बनाना कर सकते हैं:

% : %.cpp 
    g++ $(CFLAGS) $(LIBS) -o [email protected] $< 

यहाँ % किसी भी अरिक्त-स्ट्रिंग से मेल खाता है। स्वचालित चर [email protected] और $< लक्ष्य फ़ाइल और स्रोत फ़ाइल के नामों को प्रतिस्थापित करते हैं। अधिक जानकारी के लिए आप make documentation से परामर्श कर सकते हैं।

+8

यह केवल 'जी ++ $ (CFLAGS) की तरह लग रहा -ओ $ @ $ <$ (LIBS)' काम करेंगे। लेकिन मुझे लगता है कि यह एक opencv बात है। मेकफ़ाइल के लिए धन्यवाद। क्या आप समझ सकते हैं कि – SPV

+0

बनाने के बारे में जानने के लिए इसका क्या अर्थ है या कोई अच्छा संसाधन दें: [मैन्युअल] (http://www.gnu.org/software/make/manual/make.html)। यह दिखने के रूप में डरावना और समझना मुश्किल नहीं है। – morynicz

+3

धन्यवाद शिव प्रसाद वर्मा, यह वास्तव में तर्कों का ** आदेश ** था। '$ (LIBS)' ** संकलन कमांड ** के अंत में जाना चाहिए, या ओपनसीवी उदाहरण स्वयं संकलित नहीं होंगे! – cosimo

0

है जिसमें निम्न शामिल अपने काम निर्देशिका में makefile नाम की एक फ़ाइल बनाएं

$ make 

(अपने पुनश्च उत्तर देने के लिए - ध्यान दें कि CMakemake से बहुत अलग है - अभी के लिए आपको केवल make का उपयोग करना चाहिए।)

5

जीएनयू मेक बहुत स्मार्ट है और इसके लिए आपको जिस मेकफ़ाइल की आवश्यकता है, उसे अब तक दिए गए अन्य उत्तरों में वर्बोज़ होने की आवश्यकता नहीं है। यहां एक सरल मेकफ़ाइल है जिसका उपयोग आप ओपनसीवी उदाहरणों को संकलित करने के लिए कर सकते हैं:

CPPFLAGS = $(shell pkg-config --cflags opencv) 
LDLIBS = $(shell pkg-config --libs opencv) 

यही है। मेकफ़ाइल मेक implicit rules के लिए यह छोटा धन्यवाद हो सकता है।

फिर हमेशा की तरह make चलाएँ:

make facedetect 

इसमें यह माना जाता है एक facedetect.c या facedetect.cpp एक ही निर्देशिका में।

मैं निम्नलिखित (! मुक्त) पुस्तक की सिफारिश यदि आप सुनिश्चित सीखना चाहते हैं: http://oreilly.com/catalog/make3/book/index.csp

+0

आज, आप बस cmake इंस्टॉल कर सकते हैं (यदि पहले से स्थापित नहीं है => sudo apt-install cmake इंस्टॉल करें); टर्मिनल खोलें; opencv फ़ोल्डर में नेविगेट करें; सेमीकेक; बनाना; cmake के बाद "।" (डॉट) पर ध्यान दें, अब, सबकुछ बनने के लिए प्रतीक्षा करें – ComputerSaysNo

+1

@ कंप्यूटर दर्शक नहीं: मुझे लगता है कि आपने इस सवाल को गलत समझा। वह ओपनसीवी संकलित करने की कोशिश नहीं कर रहा है, लेकिन स्रोत फाइलें जिन्हें उन्होंने स्वयं पुस्तक में अभ्यास से लिखा है (जो ओपनसीवी पुस्तकालयों का उपयोग करते हैं)। – Serrano

+0

आह, हाँ, बुरी तरह गलत समझा, मुझे खेद है – ComputerSaysNo