questo è il mio file .pro:QtCreator multipla definizione di compilazione bug
QT += core gui widgets
TARGET = link_mult_def
TEMPLATE = app
SOURCES += main.cpp \
path2/file.cpp \
path1/file.cpp
HEADERS +=
Per qualche ragione, QtCreator non rispetta la struttura della cartella principale quando si costruisce i file .o dai file cpp. Entrambi i file saranno compilati in "shadow_build_directory/file.o". Mi aspetto che il processo di generazione crei le directory path1 e path2 nella directory di creazione shadow e compili "path1/file.cpp" in "shadow_build_directory/path1/file.o" e "path2/file.cpp" in "shadow_build_directory/path2/file.o".
Poiché i simboli compilati da entrambe le fonti si sommano nel file.o non è ancora un grosso problema. Essa diventa un grosso problema quando QtCreator cerca di link:
g++ -Wl,-O1 -o link_mult_def main.o file.o file.o -L/usr/lib/x86_64-linux-gnu -lQtCore -lpthread
link QtCreator file.o due volte che rende il linker esito negativo con mutiple Errore di definizione.
Come posso assicurarmi che QtCreator compili per i file oggetto che riflettono la struttura della directory di origine?
Grazie
EDIT:
percorso1/file.cpp
#include <iostream>
void function1()
{
std::cout << "function1" << std::endl;
}
percorso2/file.cpp
#include <iostream>
void function2()
{
std::cout << "function2" << std::endl;
}
processo di compilazione da 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
In realtà è il modo in cui QtCreator utilizza qmake. Non dico nulla a qmake. Ho appena aggiunto i file sorgenti al mio progetto. Ho bisogno di tutti i file per creare il mio eseguibile. Ma quando costruisco il progetto fallisce. – HenrySpencer
Sono abbastanza sicuro che il codice sorgente sia a posto. È un problema con QtCreator. Come puoi vedere entrambi i file sorgente sono compilati nello stesso file oggetto che appare due volte nella chiamata del linker. Che porta a un errore di definizione più semplice. Non so come dire a QtCreator di compilare file di oggetti separati. – HenrySpencer
Mi dispiace, non avevo visto che hai usato lo stesso nome di file nelle sottodirectory ... scusa per il rumore. – Mat