2012-09-11 20 views
11

to moja .pro file:Qt Creator stwardnienie definicja build bug

QT  += core gui widgets 

TARGET = link_mult_def 

TEMPLATE = app 

SOURCES += main.cpp \ 
      path2/file.cpp \ 
      path1/file.cpp 

HEADERS += 

Z jakiegoś powodu, Qt Creator nie respektować strukturę folderu źródłowego podczas budowy .o pliki z plików .cpp. Oba pliki zostaną skompilowane do "shadow_build_directory/file.o". Spodziewam się, że proces kompilacji utworzy katalogi path1 i path2 w katalogu budowania cienia i skompiluje "path1/file.cpp" do "shadow_build_directory/path1/file.o" i "path2/file.cpp" do "shadow_build_directory/path2/plik.o ".

Ponieważ skompilowane symbole z obu źródeł sumują się w pliku file.o, nie jest to jeszcze duży problem. Staje się to dużym problemem, gdy Qt Creator próbuje linku:

g++ -Wl,-O1 -o link_mult_def main.o file.o file.o -L/usr/lib/x86_64-linux-gnu -lQtCore -lpthread 

linki Qt Creator file.o dwa razy, co sprawia, że ​​łącznik nie z roznych błędu rozdzielczości.

Jak mogę się upewnić, że QtCreator kompiluje się do plików obiektów, które odzwierciedlają strukturę katalogu źródłowego?

Dzięki

EDIT:

ścieżka1/file.cpp

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

ścieżka2/file.cpp

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

proces budowy przez Qt Creator:

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

W rzeczywistości jest to sposób, w jaki QtCreator używa qmake. Nic nie mówię do qmake. Po prostu dodaje pliki źródłowe do mojego projektu. Potrzebuję wszystkich plików do zbudowania mojego pliku wykonywalnego. Ale kiedy buduję projekt, to się nie udaje. – HenrySpencer

+0

Jestem prawie pewien, że kod źródłowy jest w porządku. Jest to problem z QtCreator. Jak widać oba pliki źródłowe są kompilowane do tego samego pliku obiektów, który pojawia się dwa razy w wywołaniu linkera. Co prowadzi do błędu definicji błędu. Nie wiem, jak przekazać QtCreatorowi kompilację do oddzielnych plików obiektów. – HenrySpencer

+0

Niestety, nie widziałem, żebyś używał tej samej nazwy pliku w podkatalogach ... przepraszam za hałas. – Mat

Odpowiedz

0

W przeszłości miałem podobny problem z Visual Studio. To, co robi, to kompiluje i umieszcza wszystkie pliki obiektów w jednym katalogu, tak jak w twoim przypadku. Pracowaliśmy nad tym, nie mając duplikatów nazw plików w projekcie.

Jeśli to, co mówisz, jest prawdą - że QtCreator umieszcza wszystkie pliki obiektów w jednym katalogu, wszystko co możesz zrobić, to nazwać pliki z unikalnymi nazwami dla każdego projektu.

+0

Dodałem kroki budowania z QtCreator. Widać, że kompiluje się do tego samego pliku obiektu. Niestety nie mogę zmienić struktury źródłowej, ponieważ nie jest to mój kod ... – HenrySpencer

-1

Rozwiązaniem byłoby po prostu zmiana nazwy plików. Katalogi i struktura katalogów twojego projektu mają nic wspólnego z kompilatorem. Kompilator nawet nie dba o to, gdzie są pliki, musi tylko uzyskać plików, bez względu na to, czy pliki są w folderze /src, czy na Księżycu.

Teraz po utworzeniu plików .o pojawia się błąd, ponieważ masz dwa pliki o tej samej nazwie.

Nawet jeśli nie masz tego problemu, tworzenie wielu plików o tej samej nazwie jest złe, zwłaszcza jeśli nazwy są bez znaczenia, jako file.cpp.

+0

Nie mogę zmieniać nazw plików, ponieważ nie jest to mój kod i nie mogę zmienić struktury kodu. Ludzie zabiją mnie, jeśli zacznę zmieniać nazwy plików. Myślę, że problem polega na tym, że mamy pliki źródłowe rozdzielone w katalogach, ale proces kompilacji nie rozdziela plików obiektów w ten sam sposób. – HenrySpencer

+4

"Nawet jeśli nie masz tego problemu, tworzenie wielu plików o tej samej nazwie jest złe, szczególnie jeśli nazwy są bez znaczenia, jako plik.cpp." Stworzyłem minimalny przykład, dlatego pliki mają nazwę "file.cpp". Nie sądzę, że źle jest mieć pliki o tej samej nazwie. Właśnie dlatego mamy katalogi w systemach plików. Wyobraźmy sobie ogromny projekt z kodem źródłowym dystrybuowanym na setkach podkatalogów. Masz różne zespoły pracujące nad różnymi podkatalogami i nie możesz im powiedzieć, żeby nie używały takich samych nazw plików jak w innych podkatalogach ... – HenrySpencer

0

Być może można podzielić cały projekt na dwa (bez dotykania istniejącej konfiguracji plików źródłowych, po prostu zarządzając plikami .pro) i skonfigurować zależności między nimi. Następnie dla każdego projektu można ustawić własny katalog plików wyjściowych (patrz na przykład here).

1

Jeśli komfortowy obiekt mający swoje pliki obok swojego plików źródłowych, a następnie można użyć albo

CONFIG += object_parallel_to_source 

lub

CONFIG += object_with_source 

zależności od wersji QMake używasz.

Odpowiedź żłobkowa z SO answer here.