c'est mon fichier .pro:QtCreator définition multiple build bug
QT += core gui widgets
TARGET = link_mult_def
TEMPLATE = app
SOURCES += main.cpp \
path2/file.cpp \
path1/file.cpp
HEADERS +=
Pour une raison quelconque, QtCreator ne respecte pas la structure du dossier source lors de la construction des fichiers .o à partir des fichiers .cpp. Les deux fichiers seront compilés dans "shadow_build_directory/file.o". Je m'attendrais à ce que le processus de construction crée les répertoires path1 et path2 dans le répertoire de construction de l'ombre et compile "path1/file.cpp" en "shadow_build_directory/path1/file.o" et "path2/file.cpp" en "shadow_build_directory/path2/file.o ".
Puisque les symboles compilés des deux sources s'ajoutent dans le fichier, ce n'est pas encore un gros problème. Il devient un gros problème quand QtCreator tente de lien:
g++ -Wl,-O1 -o link_mult_def main.o file.o file.o -L/usr/lib/x86_64-linux-gnu -lQtCore -lpthread
liens QtCreator file.o deux fois ce qui rend l'éditeur de liens échoue avec mutiple erreur de définition.
Comment puis-je m'assurer que QtCreator compile les fichiers objet qui reflètent la structure du répertoire source?
Merci
EDIT:
chemin1/file.cpp
#include <iostream>
void function1()
{
std::cout << "function1" << std::endl;
}
path2/file.cpp
#include <iostream>
void function2()
{
std::cout << "function2" << std::endl;
}
processus de construction par 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
En fait, c'est la façon dont QtCreator utilise qmake. Je ne dis rien à qmake. Je viens d'ajouter des fichiers source à mon projet. J'ai besoin de tous les fichiers pour construire mon exécutable. Mais quand je construis le projet, il échoue. – HenrySpencer
Je suis assez sûr que le code source est bien. C'est un problème avec QtCreator. Comme vous pouvez le voir les deux fichiers source sont compilés dans le même fichier objet qui apparaît deux fois dans l'appel de l'éditeur de liens. Ce qui conduit à une erreur de définition multi-critères. Je ne sais pas comment dire à QtCreator de compiler pour séparer les fichiers objets. – HenrySpencer
Désolé, je ne vous avais pas vu utiliser le même nom de fichier dans les sous-répertoires ... désolé pour le bruit. – Mat