это мой .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
Если вам удобно иметь ваши объектные файлы вместе с исходными файлами, то вы можете использовать любой
CONFIG += object_parallel_to_source
или же
CONFIG += object_with_source
в зависимости от того, какую версию QMake вы используете.
Ответ выписан из ТАК ответ здесь.
У меня была точно такая же проблема с Visual Studio в прошлом. Он компилирует и помещает все объектные файлы в один каталог, как в вашем случае. Мы работали над этим, не имея дублирующих имен файлов в проекте.
Если то, что вы говорите, верно — что QtCreator размещает все объектные файлы в одном каталоге, тогда все, что вы можете сделать, это присвоить вашим файлам уникальные имена для каждого проекта.
Возможно, вы могли бы разделить весь проект на два (не затрагивая существующую конфигурацию исходных файлов, просто управляя файлами .pro) и установив зависимости между ними. Затем для каждого проекта вы можете установить собственный каталог выходных файлов сборки (см., Например, Вот).
Решением будет просто переименовать ваши файлы. Каталоги и структура каталога вашего проекта имеют ничего такого делать с компилятором. Компилятору даже не важно, где находятся файлы, ему просто нужно получить файлы, независимо от того, находятся ли файлы в /src
папка или на луне.
Теперь, очевидно, после .o
файлы сделаны, вы получите ошибку, просто потому что у вас есть два файла с одинаковым именем.
Даже если у вас не было этой проблемы, создание файлов с одинаковыми именами плохо, особенно если имена бессмысленны, так как file.cpp
,