Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
like image 603
HenrySpencer Avatar asked Sep 11 '12 08:09

HenrySpencer


1 Answers

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.

like image 163
TriskalJM Avatar answered Oct 20 '22 08:10

TriskalJM