如何使用qmake与两个具有相同名称的源文件?

时间:2011-10-14 08:45:43

标签: qt visual-c++ qmake

我的Qt项目有两个源名相同但位于不同文件夹的源文件。 专业文件是:

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

它可以通过Qt Visual Studio插件生成Visual Studio解决方案文件,但它不起作用,因为生成的目标文件具有相同的名称:Test.obj。 这将导致 LNK2001未解析的外部符号,因为其中一个Test.obj被覆盖。

如何编写适当的专业文件来处理?

4 个答案:

答案 0 :(得分:15)

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

CONFIG += object_with_source

但是正如选项名称所暗示的那样,.obj文件不会在out-of-source /“shadow build”目录中创建。

该选项已在Qt 5中被object_parallel_to_source取代,该选项应与阴影构建一起使用。

答案 1 :(得分: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.

显然每个专业文件的内容取决于您的解决方案。

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

答案 2 :(得分:1)

一种解决方案是重命名文件:

A/a_Test.cpp 
B/b_Test.cpp

它有点难看,但它的简单和类名可以保持不变。

答案 3 :(得分:0)

我最近也遇到过这个问题。将项目拆分为子项目使得一切变得更加复杂,并且 - 至少在我的第一次尝试时 - 完全无法运行。然后我尝试了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?(通过附加{{1}将目标文件的输出目录更改为相对目录}在项目设置“C / C ++”>“输出文件”>“对象文件名”中。

显然,每次使用QMake创建新的Visual Studio项目时,您都不想手动执行此操作,那么为什么不自动化呢?所有Visual Studio项目文件都是普通的XML文件。在设置选项之前和之后查看差异会显示它保存在一个名为%(RelativeDir)的唯一标记中。

所以我写了这个Python脚本:

ObjectFileName

..并在我的bat文件中使用它,我总是调用它来创建Visual Studio项目:

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()

不是一个漂亮的解决方案,但它确实有效。