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
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
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
Niestety, nie widziałem, żebyś używał tej samej nazwy pliku w podkatalogach ... przepraszam za hałas. – Mat