這是我的.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
其實這是QtCreator使用qmake的方式。我不告訴任何事情qmake。我只是將源文件添加到我的項目中。我需要所有的文件來構建我的可執行文件。但是當我構建項目失敗時。 – HenrySpencer
我很確定源代碼是好的。這是QtCreator的一個問題。正如你所看到的,兩個源文件都被編譯成了在鏈接器調用中出現兩次的同一個目標文件。這導致多重定義錯誤。我不知道如何告訴QtCreator編譯爲單獨的目標文件。 – HenrySpencer
對不起,我沒有看到你在子目錄中使用了相同的文件名...對於噪音抱歉。 – Mat