我的Qt项目有两个源文件,它们的名称相同但在不同的文件夹中。pro文件如下:
SOURCES = A/Test.cpp
SOURCES += B/Test.cpp
可以通过Qt Visual Studio插件生成Visual Studio解决方案文件,但由于生成的目标文件具有相同的名称:Test.obj,所以它不起作用。
这将导致 LNK2001 unresolved external symbol ,因为其中一个Test.obj被覆盖了。
如何编写正确的pro文件来解决这个问题?
我的Qt项目有两个源文件,它们的名称相同但在不同的文件夹中。pro文件如下:
SOURCES = A/Test.cpp
SOURCES += B/Test.cpp
可以通过Qt Visual Studio插件生成Visual Studio解决方案文件,但由于生成的目标文件具有相同的名称:Test.obj,所以它不起作用。
这将导致 LNK2001 unresolved external symbol ,因为其中一个Test.obj被覆盖了。
如何编写正确的pro文件来解决这个问题?
您可以尝试将该行添加到您的.pro文件中:
CONFIG += object_with_source
但是正如选项名称所示,.obj文件将不会在源代码之外的/“阴影构建”目录中创建。
该选项已被Qt 5中的object_parallel_to_source
替换,它应该可以与阴影构建一起使用。
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.
显然,每个配置文件的内容取决于您的解决方案。
如果您不想将源文件拆分为多个项目,则更简单的解决方案可能是重命名其中一个冲突文件,我猜。
我最近遇到了这个问题。将项目拆分为子项目使一切变得更加复杂,并且-至少在我的第一次尝试中-根本不起作用。然后我尝试了CONFIG += object_with_source
和CONFIG += 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
不是一个优美的解决方案,但它有效。
A/a_Test.cpp
B/b_Test.cpp
虽然有点丑陋,但它很简单,类名可以保持不变。