2010-06-02 9 views
7

मेरी क्यूटी परियोजना को कुछ हद तक व्यवस्थित (क्यूटी निर्माता का उपयोग करके) रखने के लिए, मुझे एक .pro फ़ाइल और एकाधिक .pri फ़ाइलें मिल गई हैं। हाल ही में मैंने अपनी .pri फ़ाइलों में से एक में एक क्लास जोड़ा है जिसमें एक ही फ़ाइल नाम एक वर्ग के रूप में है जो पहले से ही एक अलग .pri फ़ाइल में मौजूद है।क्यूटी एमओसी फ़ाइल नाम कई .pri फ़ाइलों का उपयोग करके टकराव

qmake द्वारा उत्पन्न फ़ाइल संरचना और मेकफ़ाइल फ़ाइल नाम टकराव के लिए अनजान प्रतीत होता है। जेनरेट की गई moc_ * फ़ाइलों को सभी एक ही उपनिर्देशिका (या तो रिलीज़ या डिबग, निर्भर करता है) में फेंक दिया जाता है और एक दूसरे को ओवरराइट करने के समाप्त होता है। जब मैं प्रोजेक्ट बनाने की कोशिश करता हूं, तो मुझे इस तरह की कई चेतावनियां मिलती हैं:

Makefile.Release:318: warning: overriding commands for target `release/moc_file.cpp` 

और प्रोजेक्ट लिंक करने में विफल रहता है।

यहां मैं जो बात कर रहा हूं उसका एक सरल उदाहरण है।

निर्देशिका संरचना:

 
+ project_dir 
| + subdir1 
| | - file.h 
| | - file.cpp 
| + subdir2 
| | - file.h 
| | - file.cpp 
| - main.cpp 
| - project.pro 
| - subdir1.pri 
| - subdir2.pri 

project.pro की सामग्री:

TARGET = project 
TEMPLATE = app 
include(subdir1.pri) 
include(subdir2.pri) 
SOURCES += main.cpp 

subdir1.pri की सामग्री:

HEADERS += subdir1/file.h 
SOURCES += subdir1/file.cpp 

subdir2.pri की सामग्री:

HEADERS += subdir2/file.h 
SOURCES += subdir2/file.cpp 

क्या कोई ऐसा सिस्टम उत्पन्न करने के लिए qmake को बताने का कोई तरीका है जो moc_ * फ़ाइलों को अलग .pri फ़ाइलों को अलग उपनिर्देशिकाओं में रखता है?

उत्तर

3

यह सुनिश्चित करने के लिए सबसे अच्छी बात यह है कि सभी फाइलों का एक अद्वितीय नाम है। क्यूमेक के अलावा अन्य टूल्स भी हैं जो आप जो भी कर रहे हैं उसे करने का प्रयास करते समय भी तोड़ देंगे; आप संभावित रूप से इसे अपने लिए भ्रमित कर सकते हैं (उदाहरण के लिए #include "file.h" क्या समझना मुश्किल है)।

+0

मैं जरूरी भ्रम तर्क से सहमत नहीं है के रूप में मेरे शामिल बयान आम तौर पर फार्म के होगा: #include "subdir1/file.h" nontheless, आप सही होने लगते हैं। अद्वितीय फ़ाइल नाम यहां जाने का एकमात्र तरीका प्रतीत होता है। – Stephen

+0

मेरा मानना ​​है कि एमओसी फाइलें और ऑब्जेक्ट फाइलें अब टकरा नहीं जाएंगी यदि आपने मेरा पीछा किया है .. हालांकि आपकी टिप्पणी के विपरीत :) मेरा गलत होने पर मुझे सही करें .. – liaK

4

subdir1.pri में subdir2.pri के लिए

MOC_DIR = "subdir1/MOCFiles" 

भी जोड़कर देना

MOC_DIR = "subdir2/MOCFiles" 

यह परीक्षण नहीं किया है की कोशिश करो। बस इसे देखें। उम्मीद है कि यह काम करेगा।

संपादित करें 1: जहां आपकी एमओसी फाइलों के लिए एमओसीफ़ाइल आपकी वांछित फ़ोल्डर है।

संपादित करें 2: मैंने अभी एमओसी फाइल निर्देशिका के साथ उल्लेख करना बंद कर दिया है क्योंकि विशेष रूप से इस प्रश्न में पूछा गया है। लेकिन इसके अतिरिक्त आपको प्रत्येक प्राइ फाइलों में निम्नलिखित जोड़ना पड़ सकता है। (सुनिश्चित करें कि फ़ोल्डरों अलग * .pri फ़ाइलों के लिए अलग अलग हैं)

RCC_DIR = "subdir1/RCCFiles" 
UI_DIR = "subdir1/UICFiles" 
OBJECTS_DIR = "subdir1/ObjFiles" 

मैं कई pri फ़ाइलें एक ही फ़ाइल नाम होने से टकराव के बिना काम कर सकते हैं होने विश्वास करते हैं। चूंकि आपने एक उत्तर स्वीकार कर लिया है (जिसमें कहा गया है कि यह संभव नहीं है), उपरोक्त परिवर्तन करें और कोशिश करें। अगर यह काम नहीं कर रहा है तो बताएं।

+0

कोई भाग्य नहीं। Moc फ़ाइलें अब एक-दूसरे के साथ टकराव नहीं कर रही हैं, लेकिन ऑब्जेक्ट (.o) फ़ाइलें हैं। अफसोस। – Stephen

+0

OBJECTS_DIR = "subdir2/ObjFiles" देने का प्रयास करें – liaK

0

मैंने पहले यह कोशिश की है। संक्षिप्त जवाब उन्हें किसी भी तरह अलग नाम देना है।एक और जवाब प्रत्येक उपनिर्देशिका को एक अलग पुस्तकालय के रूप में अपने स्वयं के .pro फ़ाइल के साथ इलाज करना होगा, और सभी लाइब्रेरी निर्देशिकाओं को संकलित करने के लिए उप-प्रकार प्रकार का उपयोग करना होगा।

यदि आप वास्तव में एक पूर्ण उत्तर की जांच करना चाहते हैं, तो आप moc के लिए उपयोग किए जाने वाले टूल को निर्दिष्ट कर सकते हैं। इस स्थिति में, आप नाम को उलझाने में सक्षम हो सकते हैं ताकि दो अलग-अलग फ़ाइलों के लिए थोड़ा अलग नाम उपयोग किया जा सके। हालांकि, आपको यह सुनिश्चित करने की भी आवश्यकता होगी कि संकलित और लिंक करने के लिए फ़ाइलों की सूची में प्रत्येक अलग-अलग नाम वाली फ़ाइल को जोड़ा जाए, और मूल रूप से नामित एमओसी फ़ाइल नहीं है (या आपका निर्माण विफल हो जाएगा)।

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

  • कोई संबंधित समस्या नहीं^_^