这是我的.pro文件:
QT += core gui widgets
TARGET = link_mult_def
TEMPLATE = app
SOURCES += main.cpp \
path2/file.cpp \
path1/file.cpp
HEADERS +=
出于某种原因,从.cpp文件构建.o文件时,QtCreator不尊重源文件夹结构。这两个文件都将编译为“shadow_build_directory / file.o”。我希望构建过程在shadow构建目录中创建path1和path2目录,并将“path1 / file.cpp”编译为“shadow_build_directory / path1 / file.o”,将“path2 / file.cpp”编译为“shadow_build_directory / path2 /” file.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
答案 0 :(得分:1)
如果您愿意将目标文件与源文件放在一起,那么您可以使用
CONFIG += object_parallel_to_source
或
CONFIG += object_with_source
取决于您使用的QMake版本。
来自http://blog.thedigitalcatonline.com/blog/2015/05/13/python-oop-tdd-example-part1/#.VxEEfjE2sdQ的答案。
答案 1 :(得分:0)
我过去在Visual Studio中遇到了完全相同的问题。它的作用是编译并将所有目标文件放在一个目录中,就像你的情况一样。我们通过在项目中没有重复的文件名来解决这个问题。
如果您说的是真的 - QtCreator将所有目标文件放在一个目录中,那么您所能做的就是为每个项目命名具有唯一名称的文件。
答案 2 :(得分:0)
也许您可以将整个项目划分为两个(不涉及现有的源文件配置,只管理.pro文件)并设置它们之间的依赖关系。然后,对于每个项目,您可以设置自己的输出构建文件目录(例如,参见here)。
答案 3 :(得分:-1)
解决方案是重命名您的文件。项目的目录和目录结构与编译器有 nothing 。编译器甚至不关心文件的位置,只需要获取文件,无论文件是在/src
文件夹中还是在月球上。
现在很明显,在.o
文件生成之后,您会收到错误,因为您有两个同名文件。
即使您没有遇到此问题,使用相同名称的多个文件也是不好的,特别是如果名称没有意义,则为file.cpp
。