2012-09-11 2 views
11

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 
+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

+0

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

+0

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

Répondre

0

J'ai eu le même problème avec Visual Studio dans le passé. Ce qu'il fait est qu'il compile et place tous les fichiers objets dans un répertoire, comme dans votre cas. Nous avons travaillé autour de cela en n'ayant pas de noms de fichiers en double dans un projet. Si ce que vous dites est vrai - que QtCreator place tous les fichiers objets dans un répertoire, alors tout ce que vous pouvez faire est de nommer vos fichiers avec des noms uniques par projet.

+0

J'ai ajouté les étapes de construction de QtCreator. Vous pouvez voir qu'il compile dans le même fichier objet. Malheureusement je ne suis pas autorisé à changer la structure de la source car ce n'est pas mon code ... – HenrySpencer

-1

La solution serait de simplement renommer vos fichiers. Les répertoires et la structure de dir de votre projet ont rien à voir avec le compilateur. Le compilateur ne se soucie même pas où les fichiers sont, il suffit de obtenir les fichiers, peu importe si les fichiers sont dans le dossier /src, ou sur la Lune.

Maintenant, évidemment, après les fichiers .o sont faites, vous obtenez l'erreur, tout simplement parce que vous avez deux fichiers du même nom.

Même si vous n'avez pas rencontré ce problème, il est mauvais de multiplier les fichiers avec le même nom, surtout si les noms n'ont pas de sens, comme file.cpp.

+0

Je ne dois pas renommer les fichiers car ce n'est pas mon code et je ne dois pas changer la structure du code. Les gens vont me tuer si je commence à renommer les fichiers. Je pense que le problème est, que nous avons séparé les fichiers source dans les répertoires, mais le processus de construction ne sépare pas les fichiers objet de la même manière. – HenrySpencer

+4

"Même si vous n'aviez pas ce problème, faire des fichiers de multiplication avec le même nom est mauvais, surtout si les noms n'ont pas de sens, comme fichier.cpp." J'ai créé un exemple minimal, c'est pourquoi les fichiers sont nommés "fichier.cpp". Je ne pense pas que ce soit mauvais d'avoir des fichiers avec le même nom. C'est pourquoi nous avons des répertoires dans les systèmes de fichiers. Imaginez un énorme projet avec le code source distribué sur plusieurs centaines de sous-répertoires. Vous avez différentes équipes travaillant sur des sous-répertoires différents et vous ne pouvez pas leur dire de ne pas utiliser les mêmes noms de fichier que dans les autres sous-répertoires ... – HenrySpencer

0

Vous pourriez peut-être diviser l'ensemble du projet en deux (sans toucher à la configuration des fichiers sources existants, en gérant simplement les fichiers .pro) et en définissant les dépendances entre eux. Ensuite, pour chaque projet, vous pouvez définir le propre répertoire des fichiers de sortie (voir, par exemple, here).

1

Si vous êtes à l'aise avec vos fichiers d'objets à côté de vos fichiers source, vous pouvez utiliser

CONFIG += object_parallel_to_source 

ou

CONFIG += object_with_source 

selon la version de QMake que vous utilisez.

Réponse crèche de SO answer here.

Questions connexes