我有一个项目,我想在同时使用 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 中的每个空格都被检测为新词。
最佳答案
首先,我不知道这是否是您问题中的错字,但语法是 $(patsubst <pat>,<pat>,<words>)
; patsubst
后没有逗号关键字。
其次,一般来说,GNU make 不能处理其函数中的空格。 %
在 patsubst
指的是每个空格分隔的word,所以扩展$(INCLUDE_LIST)
中的words将是:第一个 "C:\Program
, 接下来 Files
, 接下来 (x86)\Microsoft
等。这些都不匹配模式 "%"
.
你可以试试这个:
$(patsubst "C:\Program,$(INCLUDE_DELIMITER)"C:\Program,$(INCLUDE_LIST))
第三,您真的不想在 GNU make 的参数中使用反斜杠。幸运的是,包括 Visual Studio 在内的大多数 Windows 工具都接受路径名分隔符中的正斜杠和反斜杠。我建议您改用这些。
关于c++ - 在带有变量包含参数的 makefile 中添加 Windows 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40579870/