Ошибка сборки множественного определения QtCreator

это мой .pro файл:

QT       += core gui widgets

TARGET = link_mult_def

TEMPLATE = app

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

HEADERS +=

По какой-то причине QtCreator не учитывает структуру исходных папок при сборке файлов .o из файлов .cpp. Оба файла будут скомпилированы в «shadow_build_directory / file.o». Я ожидал бы, что процесс сборки создаст каталоги path1 и path2 в каталоге теневой сборки и скомпилирует «path1 / file.cpp» в «shadow_build_directory / path1 / file.o» и «path2 / file.cpp» в «shadow_build_directory / path2 /» file.o».

Поскольку скомпилированные символы из обоих источников суммируются в файле .o, это не такая уж большая проблема. Это становится большой проблемой, когда QtCreator пытается связать:

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

QtCreator ссылается на file.o два раза, что приводит к сбою компоновщика с ошибкой определения множественного числа

Как я могу убедиться, что QtCreator компилируется в объектные файлы, которые отражают структуру исходного каталога?

Спасибо

РЕДАКТИРОВАТЬ:

path1 / file.cpp

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

path2 / file.cpp

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

Процесс сборки 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

11

Решение

Если вам удобно иметь ваши объектные файлы вместе с исходными файлами, то вы можете использовать любой

CONFIG += object_parallel_to_source

или же

CONFIG += object_with_source

в зависимости от того, какую версию QMake вы используете.

Ответ выписан из ТАК ответ здесь.

1

Другие решения

У меня была точно такая же проблема с Visual Studio в прошлом. Он компилирует и помещает все объектные файлы в один каталог, как в вашем случае. Мы работали над этим, не имея дублирующих имен файлов в проекте.

Если то, что вы говорите, верно — что QtCreator размещает все объектные файлы в одном каталоге, тогда все, что вы можете сделать, это присвоить вашим файлам уникальные имена для каждого проекта.

0

Возможно, вы могли бы разделить весь проект на два (не затрагивая существующую конфигурацию исходных файлов, просто управляя файлами .pro) и установив зависимости между ними. Затем для каждого проекта вы можете установить собственный каталог выходных файлов сборки (см., Например, Вот).

0

Решением будет просто переименовать ваши файлы. Каталоги и структура каталога вашего проекта имеют ничего такого делать с компилятором. Компилятору даже не важно, где находятся файлы, ему просто нужно получить файлы, независимо от того, находятся ли файлы в /src папка или на луне.

Теперь, очевидно, после .o файлы сделаны, вы получите ошибку, просто потому что у вас есть два файла с одинаковым именем.

Даже если у вас не было этой проблемы, создание файлов с одинаковыми именами плохо, особенно если имена бессмысленны, так как file.cpp,

-1
По вопросам рекламы [email protected]