1

我定义了以下环境变量:

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 定义的环境变量是必需的。有人知道解决方法吗?

4

1 回答 1

0

我无法重现您的问题。

我用给定的值创建了一个新的环境变量PLATFORM_SDKC:\Program Files\Microsoft SDKs\Windows\v7.0. 然后我重新启动 Qt Creator 并检查 PLATFORM_SDK 是否可以在环境变量列表中找到(请参见此处)。然后我创建了一个简单的 .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 时,就会得到环境变量的内容。

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

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

于 2013-05-08T08:01:31.177 回答