Reputation: 111
this is my .pro file:
QT += core gui widgets
TARGET = link_mult_def
TEMPLATE = app
SOURCES += main.cpp \
path2/file.cpp \
path1/file.cpp
HEADERS +=
For some reason, QtCreator does not respect the source folder structure when building the .o files from the .cpp files. Both files will be compiled to "shadow_build_directory/file.o". I would expect the build process to create path1 and path2 directories in the shadow build directory and compile "path1/file.cpp" to "shadow_build_directory/path1/file.o" and "path2/file.cpp" to "shadow_build_directory/path2/file.o".
Since the compiled symbols from both sources add up in the file.o it is not such a big problem yet. It becomes a big problem when QtCreator tries to link:
g++ -Wl,-O1 -o link_mult_def main.o file.o file.o -L/usr/lib/x86_64-linux-gnu -lQtCore -lpthread
QtCreator links file.o two times which makes the linker fail with mutiple definition error.
How can I make sure that QtCreator compiles to object files that reflect the source directory structure?
Thanks
EDIT:
path1/file.cpp
#include <iostream>
void function1()
{
std::cout << "function1" << std::endl;
}
path2/file.cpp
#include <iostream>
void function2()
{
std::cout << "function2" << std::endl;
}
Build process by 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
Upvotes: 11
Views: 5348
Reputation: 2457
If you're comfortable having your object files alongside your source files, then you can use either
CONFIG += object_parallel_to_source
or
CONFIG += object_with_source
depending on which version of QMake you're using.
Answer cribbed from SO answer here.
Upvotes: 1
Reputation: 3143
Perhaps you could divide the entire project into two ones (without touching the existing source files configuration, just managing the .pro files) and set up the dependencies between them. Then for each project you could set the own output build files directory (see, for example, here).
Upvotes: 0
Reputation: 29966
The solution would be to just rename your files. The directories and the dir structure of your project have nothing to do with the compiler. The compiler doesn't even care where the files are, it just needs to get the files, no matter if the files are in /src
folder, or on the Moon.
Now obviously, after the .o
files are made you get the error, simply because you have two files of the same name.
Even if you did not have this problem, making multiply files with the same name is bad, especially if the names are meaningless, as file.cpp
.
Upvotes: -1
Reputation: 3030
I had the exact same problem with Visual Studio in the past. What it does is it compiles and places all object files in one directory, just like in your case. We worked around that by not having duplicate file names in a project.
If what you say is true - that the QtCreator places all object files in one directory, then all you can do is name your files with unique names per project.
Upvotes: 0