2012-09-11 15 views
11

यह मेरा .pro फ़ाइल है:QtCreator कई परिभाषा निर्माण बग

QT  += core gui widgets 

TARGET = link_mult_def 

TEMPLATE = app 

SOURCES += main.cpp \ 
      path2/file.cpp \ 
      path1/file.cpp 

HEADERS += 

किसी कारण से, QtCreator जब सीपीपी फाइलों से ओ फ़ाइलों के निर्माण के स्रोत फ़ोल्डर संरचना सम्मान नहीं करता। दोनों फाइलों को "shadow_build_directory/file.o" में संकलित किया जाएगा। मैं निर्माण प्रक्रिया को छाया निर्माण निर्देशिका में पथ 1 और पथ 2 निर्देशिका बनाने और "path1/file.cpp" को "shadow_build_directory/path1/file.o" और "path2/file.cpp" को "shadow_build_directory/path2/file.o "।

चूंकि दोनों स्रोतों से संकलित प्रतीक फ़ाइल में जोड़ते हैं। इसलिए यह अभी तक इतनी बड़ी समस्या नहीं है।

g++ -Wl,-O1 -o link_mult_def main.o file.o file.o -L/usr/lib/x86_64-linux-gnu -lQtCore -lpthread 

QtCreator लिंक दो बार जो लिंकर एकाधिक परिभाषा त्रुटि के साथ विफल बनाता file.o: जब QtCreator लिंक की कोशिश करता है यह एक बड़ी समस्या बन जाता है।

मैं कैसे सुनिश्चित कर सकता हूं कि QtCreator उन स्रोतों को ऑब्जेक्ट करने के लिए संकलित करता है जो स्रोत निर्देशिका संरचना को प्रतिबिंबित करते हैं?

धन्यवाद

संपादित करें:

path1/असम्भव

#include <iostream> 
void function1() 
{ 
    std::cout << "function1" << std::endl; 
} 

Path2/असम्भव

#include <iostream> 
void function2() 
{ 
    std::cout << "function2" << std::endl; 
} 

प्रक्रिया बिल्ड QtCreator द्वारा:

g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../link_mult_def -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../link_mult_def -I. -o main.o ../link_mult_def/main.cpp 

g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../link_mult_def -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../link_mult_def -I. -o file.o ../link_mult_def/path1/file.cpp 

g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../link_mult_def -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../link_mult_def -I. -o file.o ../link_mult_def/path2/file.cpp 

g++ -Wl,-O1 -o link_mult_def main.o file.o file.o -L/usr/lib/x86_64-linux-gnu -lQtGui -lQtCore -lpthread 

file.o: In function `function2()': 
file.cpp:(.text+0x0): multiple definition of `function2()' 
make: Leaving directory `/home/schmid/code/misc/trash/link_mult_def-build-desktop-Qt_4_8_1_in_PATH__System__Release' 
file.o:file.cpp:(.text+0x0): first defined here 
collect2: error: ld returned 1 exit status 
make: *** [link_mult_def] Error 1 
+1

असल में यह QtCreator है जो qmake का उपयोग करता है। मैं qmake करने के लिए कुछ भी नहीं बताओ। मैं बस अपनी परियोजना में स्रोत फाइलें जोड़ता हूं। मुझे अपने निष्पादन योग्य बनाने के लिए सभी फाइलों की आवश्यकता है। लेकिन जब मैं परियोजना का निर्माण करता हूं तो यह विफल रहता है। – HenrySpencer

+0

मुझे पूरा यकीन है कि स्रोत कोड ठीक है। यह QtCreator के साथ एक समस्या है। जैसा कि आप देख सकते हैं कि दोनों स्रोत फ़ाइलों को एक ही ऑब्जेक्ट फ़ाइल में संकलित किया गया है जो लिंकर कॉल में दो बार दिखाई देता है। जो mutliple परिभाषा त्रुटि की ओर जाता है। मुझे नहीं पता कि अलग ऑब्जेक्ट फ़ाइलों को संकलित करने के लिए QtCreator को कैसे बताना है। – HenrySpencer

+0

इसके बारे में क्षमा करें, मैंने नहीं देखा था कि आपने उपनिर्देशिका में एक ही फ़ाइल नाम का उपयोग किया था ... शोर के लिए खेद है। – Mat

उत्तर

0

मुझे अतीत में विजुअल स्टूडियो के साथ एक ही समस्या थी। यह क्या करता है यह सभी ऑब्जेक्ट फ़ाइलों को एक ही निर्देशिका में संकलित करता है और आपके मामले में ही करता है। हमने एक परियोजना में डुप्लिकेट फ़ाइल नाम न होने के आसपास उस पर काम किया।

यदि आप जो कहते हैं वह सत्य है - कि QtCreator सभी ऑब्जेक्ट फ़ाइलों को एक निर्देशिका में रखता है, तो आप जो भी कर सकते हैं वह प्रति परियोजनाओं के अद्वितीय नामों के साथ आपकी फाइलों का नाम दे सकता है।

+0

मैंने QtCreator से निर्माण चरणों को जोड़ा। आप देख सकते हैं कि यह एक ही ऑब्जेक्ट फ़ाइल में संकलित है। दुर्भाग्यवश मुझे स्रोत संरचना को बदलने की अनुमति नहीं है क्योंकि यह मेरा कोड नहीं है ... – HenrySpencer

-1

समाधान केवल आपकी फ़ाइलों का नाम बदलना होगा। आपके प्रोजेक्ट की निर्देशिकाओं और डीआईआर संरचना में कंपाइलर के साथ करने के लिए कुछ भी नहीं है। कंपाइलर यह भी ध्यान नहीं देता कि फाइलें कहां हैं, इसे फ़ाइलों को प्राप्त करने की आवश्यकता है, भले ही फ़ाइलें /src फ़ोल्डर में हों या चंद्रमा पर हों।

अब स्पष्ट रूप से, .o फ़ाइलों के बाद आपको त्रुटि मिलती है, क्योंकि आपके पास एक ही नाम की दो फाइलें हैं।

भले ही आपको यह समस्या न हो, भले ही समान नाम वाली फ़ाइलों को गुणा करना बुरा हो, विशेष रूप से यदि नाम अर्थहीन हैं, file.cpp के रूप में।

+0

मुझे फ़ाइलों का नाम नहीं बदला जाना चाहिए क्योंकि यह मेरा कोड नहीं है और मुझे कोड संरचना नहीं बदलनी चाहिए। अगर मैं फाइलों का नाम बदलना शुरू करता हूं तो लोग मुझे मार देंगे। मुझे लगता है कि समस्या यह है कि हमारे पास निर्देशिकाओं में पृथक स्रोत फ़ाइलें हैं लेकिन बिल्ड प्रक्रिया ऑब्जेक्ट फ़ाइलों को उसी तरह अलग नहीं करती है। – HenrySpencer

+4

"भले ही आपको यह समस्या न हो, भले ही एक ही नाम के साथ गुणा करने वाली फाइलें खराब हों, खासकर अगर नाम अर्थहीन हैं, file.cpp के रूप में।" मैंने एक न्यूनतम उदाहरण बनाया, यही कारण है कि फ़ाइलों को "file.cpp" नाम दिया गया है। मुझे नहीं लगता कि एक ही नाम वाली फाइलें खराब हैं। यही कारण है कि हमारे पास फाइल सिस्टम में निर्देशिकाएं हैं। उपनिर्देशिका के हुंड्रेस पर वितरित स्रोत कोड के साथ एक विशाल परियोजना की कल्पना करें। आपके पास अलग-अलग उपनिर्देशिकाओं पर काम करने वाली विभिन्न टीमें हैं और आप उन्हें अन्य उपनिर्देशिकाओं में समान फ़ाइल नामों का उपयोग न करने के लिए नहीं कह सकते हैं ... – HenrySpencer

0

शायद आप पूरी परियोजना को दो में विभाजित कर सकते हैं (मौजूदा स्रोत फाइल कॉन्फ़िगरेशन को छूए बिना, बस .pro फ़ाइलों को प्रबंधित किए बिना) और उनके बीच निर्भरता सेट अप करें। फिर प्रत्येक प्रोजेक्ट के लिए आप स्वयं आउटपुट बिल्ड फाइल निर्देशिका सेट कर सकते हैं (उदाहरण के लिए, here देखें)।

1

आप आरामदायक अपने स्रोत फ़ाइलों के साथ ही आपकी वस्तु फ़ाइलों आ रही है, तो आप या तो

CONFIG += object_parallel_to_source 

या

CONFIG += object_with_source 

qmake का कौन सा संस्करण के आधार पर आप उपयोग कर रहे उपयोग कर सकते हैं।

उत्तर SO answer here से उत्तर दिया गया।

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