QtCreator(2.7.0)无法正确处理LIBS。

时间:2013-05-07 23:33:42

标签: qt4 qt-creator qmake

我定义了以下环境变量:

PLATFORM_SDK=C:\Program Files\Microsoft SDKs\Windows\v7.0

在我的项目文件中,我声明:

LIBS += $$quote($(PLATFORM_SDK)/lib/SHFolder.lib)

这会导致: Linker return error: LINK : fatal error LNK1181: cannot open input file 'C:\Program.obj'

以下声明也会产生相同的错误:

LIBS += $$quote(-L$(PLATFORM_SDK)/lib) -lSHFolder

但是,如果我明确指定相同的路径,如下所示,它可以工作:

LIBS += $$quote(C:\Program Files\Microsoft SDKs\Windows\v7.0/lib/SHFolder.lib)

对我而言,这看起来像qmake错误。

不幸的是,LIBS定义的环境变量是一个要求。 有人知道解决方法吗?

1 个答案:

答案 0 :(得分:0)

我无法重现你的问题。

我使用给定值PLATFORM_SDK创建了一个新的环境变量C:\Program Files\Microsoft SDKs\Windows\v7.0。然后我重新启动了Qt Creator并检查了可以在环境变量列表中找到PLATFORM_SDK(参见here)。然后我创建了一个简单的.pro文件,并将以下行放在那里:

LIBS = $$quote($(PLATFORM_SDK)/lib/SHFolder.lib)
message($$LIBS)
LIBS = $$quote(-L$(PLATFORM_SDK)/lib) -lSHFolder
message($$LIBS)
LIBS = $$quote(C:\Program Files\Microsoft SDKs\Windows\v7.0/lib/SHFolder.lib)
message($$LIBS)

运行QMake后,我得到了以下结果(在Compile Output中):

Project MESSAGE: C:\Program Files\Microsoft SDKs\Windows\v7.0/lib/SHFolder.lib
Project MESSAGE: -LC:\Program Files\Microsoft SDKs\Windows\v7.0/lib -lSHFolder
Project MESSAGE: C:\Program Files\Microsoft SDKs\Windows\v7.0/lib/SHFolder.lib

也就是说,您的第一个和第三个声明给出了完全相同的结果,使用环境变量没有问题。

编辑: 在下面的评论中进行对话后,我可以尝试解释问题所在。

qmake是一个基于.pro文件中的信息创建Makefile的工具。在.pro文件中,变量可用于存储环境变量的内容。这些可以在运行qmake时进行评估,也可以在生成的Makefile中包含,以便在构建项目时进行评估。如果使用$(...)运算符,则在处理生成的Makefile时将获取环境变量的内容。但是,如果使用$$(...)运算符,则在运行qmake时,即生成Makefile时,将获取环境变量的内容。

如果你的.pro文件中有LIBS += $$quote($(PLATFORM_SDK)/lib/SHFolder.lib)行,那么你的Makefile将包含这一行:LIBS = $(PLATFORM_SDK)/lib/SHFolder.lib。但是如果你的.pro文件中有这一行LIBS += $$quote($$(PLATFORM_SDK)/lib/SHFolder.lib),那么你的Makefile将包含这一行:"C:\Program Files\Microsoft SDKs\Windows\v7.0/lib/SHFolder.lib"

正如您所看到的,主要区别在于,在前一种情况下,生成到Makefile中的行未包含在双引号中,这将是一个问题,因为您的环境变量包含具有空格的路径。我不知道为什么在前一种情况下缺少双引号。他们应该在那里,因为你使用了函数$$quote(...)