使用变量包含参数在生成文件中添加 Windows 包含路径
Posted
技术标签:
【中文标题】使用变量包含参数在生成文件中添加 Windows 包含路径【英文标题】:Prepending Windows include paths in makefile with variable include argument 【发布时间】:2016-11-13 23:14:01 【问题描述】:我有一个项目,我想在带有 Microsoft Visual Studio 和 GCC 的 Windows 系统上编译。我有一个环境变量用于选择要使用的编译器(例如 COMPILER=VS 或 COMPILER=GCC)。第一个问题是GCC的“包含选项”是-I,而Visual Studio的包含选项是/I。
因此我有一个变量来指定所需的包含选项标志:
ifeq ($(COMPILER), VS)
INCLUDE_DELIMITER = /I
else
INCLUDE_DELIMITER = -I
endif
现在我建立了一个需要包含的路径列表:
COMPILER_INCLUDE_PATH = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include"
UCRT_INCLUDE_PATH = "C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt"
UM_INCLUDE_PATH = "C:\Program Files (x86)\Windows Kits\8.1\Include\um"
WINFAMILY_INCLUDE_PATH = "C:\Program Files (x86)\Windows Kits\8.1\Include\shared"
INCLUDE_LIST = $(COMPILER_INCLUDE_PATH) $(UCRT_INCLUDE_PATH) $(UM_INCLUDE_PATH) $(WINFAMILY_INCLUDE_PATH)
所以现在 INCLUDE_LIST 是引用字符串的列表(由于 windows 路径中的空格)。如何创建一个将 INCLUDE_DELIMITER(特定于编译器)添加到每个字符串的变量?
我试过了:
INCLUDES = $(patsubst, "%", $(INCLUDE_DELIMITER)"%", $(INCLUDE_LIST))
没有鸟。我也试过了:
INCLUDES = $(foreach d, $(INCLUDE_LIST), $(INCLUDE_DELIMITER)$d)
但这导致 INCLUDE_LIST 中的每个空格都被检测为一个新词。
【问题讨论】:
你考虑过使用cmake吗? 【参考方案1】:首先,我不知道你的问题是不是错字,但语法是$(patsubst <pat>,<pat>,<words>)
; patsubst
关键字后面没有逗号。
其次,通常 GNU make 无法处理其函数中的空白。 patsubst
中的%
指的是每个空格分隔的单词,因此$(INCLUDE_LIST)
扩展中的单词将是:第一个"C:\Program
,下一个Files
,下一个(x86)\Microsoft
,等等。这些都不匹配"%"
的模式。
你可以试试这个:
$(patsubst "C:\Program,$(INCLUDE_DELIMITER)"C:\Program,$(INCLUDE_LIST))
第三,你真的不想在 GNU make 的参数中使用反斜杠。幸运的是,包括 Visual Studio 在内的大多数 Windows 工具都将接受路径名分隔符中的正斜杠以及反斜杠。我建议你改用那些。
【讨论】:
是的,您正确识别出我的错别字。此解决方案按建议工作。我希望存在一些更优雅的东西(例如正则表达式支持),但现在我必须使用有效的方法。以上是关于使用变量包含参数在生成文件中添加 Windows 包含路径的主要内容,如果未能解决你的问题,请参考以下文章