使用变量包含参数在生成文件中添加 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 包含路径的主要内容,如果未能解决你的问题,请参考以下文章

Javap与JVM指令

如何在生成文件中动态重命名目标文件

通过javap命令分析java汇编指令

python中怎样在参数中加入变量

如何让用户在生成文件时下载文件

java打包成jar文件后还是不能双击运行