我定义了以下环境变量:
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定义的环境变量是一个要求。 有人知道解决方法吗?
答案 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(...)
。