c++ - 在带有变量包含参数的 makefile 中添加 Windows 路径

标签 c++ c gcc makefile

我有一个项目,我想在同时使用 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/

相关文章:

c - Tint2 编译

gcc - 使用 arm-none-eabi-gcc 从 cpp 生成 elf 文件

c++ - 在 C++ 中使用已删除的函数

我可以在 Linux 平台中向 C printf 添加新的格式说明符类型吗

c ,在函数中传递 char 数组作为参数?

c - 使用全局变量 'char **environ'实现setenv()和unsetenv()

C++ Windows 到 Linux - 我需要知道什么?

c++ - 什么是 C++ GUI 库支持 Windows 的 32 位字符 Unicode

c++ - 我可以在 C++ 中破坏结构吗?

c++ - 无符号长整型