HenrySpencer
HenrySpencer

Reputation: 111

QtCreator multiple definition build bug

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

Answers (4)

TriskalJM
TriskalJM

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

Dmitry
Dmitry

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

SingerOfTheFall
SingerOfTheFall

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

Lyubomir Vasilev
Lyubomir Vasilev

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

Related Questions