如何在makefile中写入“或”内部依赖项?

Posted

技术标签:

【中文标题】如何在makefile中写入“或”内部依赖项?【英文标题】:How to write "or" inside dependencies in makefile? 【发布时间】:2017-06-25 06:09:46 【问题描述】:

如何在makefile的依赖中写“或”,我需要同时检查.c和.cpp:

SOURCES=$(wildcard $(SRC)/*.cpp) $(wildcard $(SRC)/*.c)

myTarget: $(SOURCES:.cpp||.c=.o)
         g++ ...

它不起作用,你能在这种情况下使用“或”吗?

【问题讨论】:

不要认为他是个好主意。使用相同的编译器和选项编译 C 和 C++ 并不总是很好。我会用两条单独的规则来处理这个问题。 不能用 C++ 编译器编译 C 代码。 电源可以,但我不会,我只是好奇使用“或”的问题,至于c代码,也不编译为.o文件,当我需要它时,我编译为更容易的库。 @PerduGames “Power can”是什么意思?在一般情况下,C 代码不能用 C++ 编译器编译。一些 C 代码恰好也是有效的 C++,但依赖它确实不是一个好主意,并且很容易编写完全有效的 C 而 不是 有效的 C++(例如,使用标识符这是 C++ 中的 保留关键字 或使用指定的结构初始化器等) 是正确的,我的意思是取决于代码会编译是的,但是是的,如果它是一个不太通用的代码会指责错误。不,我不会用 c++ 编译器编译 c,这只是一个“或”的问题。 【参考方案1】:

看起来您正在使用 GNU make。如果你是,你可以使用函数subst的两次调用。

INTERMEDIATE=$(subst .cpp,.o,$(SOURCES))
OBJECTS=$(subst .c,.o,$(INTERMEDIATE))

myTarget:$(OBJECTS)

如果不想使用INTERMEDIATE,可以使用:

OBJECTS=$(subst .c,.o,$(subst .cpp,.o,$(SOURCES)))

【讨论】:

有没有办法只获取文件名而不获取目录?这里是: MyTarget: $ (SOURCES: .cpp = .o) 我得到“scr / file.o”,但我只是想让“file.o”在“obj”文件夹中创建 .o 文件时使用它,而不是“src”,我可以这样做吗? @PerduGames,您可以使用notdir函数将src$(SOURCES)中剥离出来,然后使用addprefix函数将obj/添加到每个.o文件中。您可以从its documentation site 阅读有关文件操作功能的更多信息。 我把它留在这里:SOURCES=$(wildcard $(SRC)/*.cpp) #Retrieve prefix and suffix OBJCLEAN=$(notdir $(basename $(SOURCES))) #Add new prefix and suffix OBJECTS=$(addprefix $(OBJ)/, $(addsuffix .o, $(OBJCLEAN)))

以上是关于如何在makefile中写入“或”内部依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 makefile 中不生成依赖项?

如何从文件中写入/读取变量并使用 Makefile 进行解析?

GNU makefile 规则和依赖项

CMake 的 FetchContent 与 Makefile 构建的依赖项

Makefile:如何写目标依赖

是否可以在 Makefile 的单次传递中使用 gcc/g++/nvcc 自动依赖项 -M 而无需将依赖项保存到文件中?