2012-09-11 72 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不從.cpp文件構建.o文件時必須尊重源文件夾結構。這兩個文件都將被編譯爲「shadow_build_directory/file.o」。我期望構建過程在shadow構建目錄中創建path1和path2目錄,並將「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/file.cpp

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

PATH2/file.cpp

#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的一個問題。正如你所看到的,兩個源文件都被編譯成了在鏈接器調用中出現兩次的同一個目標文件。這導致多重定義錯誤。我不知道如何告訴QtCreator編譯爲單獨的目標文件。 – HenrySpencer

+0

對不起,我沒有看到你在子目錄中使用了相同的文件名...對於噪音抱歉。 – Mat

回答

0

我在過去有過與Visual Studio完全相同的問題。它所做的是編譯並將所有目標文件放在一個目錄中,就像你的情況一樣。我們通過在項目中沒有重複的文件名來解決這個問題。

如果你說的是真的--QtCreator將所有的目標文件放在一個目錄中,那麼你所能做的就是爲每個項目命名你的文件。

+0

我添加了QtCreator的構建步驟。你可以看到它編譯到同一個目標文件。不幸的是,我不允許更改源結構,因爲它不是我的代碼... – HenrySpencer

-1

解決方案是重命名文件。你的項目的目錄和目錄結構有什麼也沒有與編譯器。編譯器甚至不關心文件的位置,它只需要得到這些文件,不管文件是在/src文件夾還是在月球上。

現在很明顯,在.o文件製成之後,您會收到錯誤信息,只是因爲您有兩個相同名稱的文件。

即使您沒有這個問題,使用相同名稱的乘法文件也是不好的,尤其是如果這些名稱沒有意義,就像file.cpp一樣。

+0

我不能重命名文件,因爲它不是我的代碼,我不能更改代碼結構。如果我開始重命名文件,人們會殺了我。我認爲問題是,我們有源文件在目錄中分離,但構建過程不會以相同的方式分離目標文件。 「 – HenrySpencer

+4

」即使你沒有這個問題,使用相同名稱的乘法文件也是不好的,特別是如果名字沒有意義,就像file.cpp一樣。 我創建了一個最小的例子,這就是爲什麼這些文件被命名爲「file.cpp」。 我不認爲用同名文件是不好的。這就是爲什麼我們在文件系統中有目錄。設想一個巨大的項目,源代碼分佈在子目錄的hundres上。你有不同的團隊在不同的子目錄上工作,你不能告訴他們不要使用與其他子目錄中相同的文件名。 – HenrySpencer

0

也許你可以將整個項目分成兩個(不需要觸摸現有的源文件配置,只需管理.pro文件),並設置它們之間的依賴關係。然後,對於每個項目,您可以設置自己的輸出構建文件目錄(例如,請參閱here)。

1

如果你有舒適沿着你的源文件的目標文件,然後你可以使用

CONFIG += object_parallel_to_source 

CONFIG += object_with_source 

,這取決於QMAKE的版本,您正在使用。

SO answer here回答cribbed。