如何使用qmake处理文件名相同的两个源文件?

17

我的Qt项目有两个源文件,它们的名称相同但在不同的文件夹中。pro文件如下:

SOURCES = A/Test.cpp 
SOURCES += B/Test.cpp

可以通过Qt Visual Studio插件生成Visual Studio解决方案文件,但由于生成的目标文件具有相同的名称:Test.obj,所以它不起作用。

这将导致 LNK2001 unresolved external symbol ,因为其中一个Test.obj被覆盖了。

如何编写正确的pro文件来解决这个问题?

4个回答

17

Qt 5之前

您可以尝试将该行添加到您的.pro文件中:

CONFIG += object_with_source

但是正如选项名称所示,.obj文件将不会在源代码之外的/“阴影构建”目录中创建。

Qt 5及更高版本

该选项已被Qt 5中的object_parallel_to_source替换,它应该可以与阴影构建一起使用。


2
注意:此功能已被移除,http://qt.gitorious.org/qt/qtbase/commit/a72420d012fd09f0a79ae75b77eb1c3bbff75669/diffs - Sebastian Negraszus
移除提交的新地址:http://code.qt.io/cgit/qt/qtbase.git/commit/?id=a72420d012fd09f0a79ae75b77eb1c3bbff75669 - SGaist

4
您应该考虑将您的解决方案拆分成多个项目,但这取决于每个文件夹是否可以单独代表一个项目。如果您选择这种方法,则需要为每个项目编写一个.pro文件。通常的做法是编写一个“通用”的*.pri文件,该文件从每个*.pro文件中包含:

folder1.pro

TEMPLATE=lib
TARGET=folder1
include( ../common.pri )

folder2.pro

TEMPLATE=lib
TARGET=folder2
include( ../common.pri )

common.pri(位于父目录中)

SOURCES += *.cpp
HEADERS += *.h
# etc.

显然,每个配置文件的内容取决于您的解决方案。

如果您不想将源文件拆分为多个项目,则更简单的解决方案可能是重命名其中一个冲突文件,我猜。


1

我最近遇到了这个问题。将项目拆分为子项目使一切变得更加复杂,并且-至少在我的第一次尝试中-根本不起作用。然后我尝试了CONFIG += object_with_sourceCONFIG += object_parallel_to_source,但似乎都不适用于我的Qt版本。

所以这就是我解决它的方法(适用于Visual Studio 2010;我不知道其他版本是否相同):

如果该项目是普通的Visual Studio项目,而不是QMake生成的项目,则可以按照此处描述的方式解决它:Visual Studio 2010 & 2008 can't handle source files with identical names in different folders?(通过在项目设置“C / C ++”>“输出文件”>“对象文件名称”中添加%(RelativeDir)来将对象文件的输出目录更改为相对目录)。

显然,每次使用QMake创建新的Visual Studio项目时手动操作是不可取的,那么为什么不自动化呢?毕竟,Visual Studio项目文件只是普通的XML文件。在设置选项之前和之后查看差异,可以发现它保存在一个称为ObjectFileName的单个唯一标记中。

因此,我编写了这个Python脚本:

import sys

filename = sys.argv[1]
f = open(filename, "r", -1, "utf-8-sig")
lines = f.readlines()
f.close()
f = open(filename, "w", -1, "utf-8-sig")
for line in lines:
    line = line.replace("</ObjectFileName>", "%(RelativeDir)\</ObjectFileName>")
    f.write(line)
f.close()

..并且在我的批处理文件中像这样使用,我总是调用它来创建Visual Studio项目:

qmake -tp vc myproject.pro
@cd ../scripts
unflatten_vcproj_obj_output.py "../src/myproject.vcxproj"
@pause

不是一个优美的解决方案,但它有效。


1
一种解决方案是重命名文件:
A/a_Test.cpp 
B/b_Test.cpp

虽然有点丑陋,但它很简单,类名可以保持不变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接