如何在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 进行解析?
CMake 的 FetchContent 与 Makefile 构建的依赖项
是否可以在 Makefile 的单次传递中使用 gcc/g++/nvcc 自动依赖项 -M 而无需将依赖项保存到文件中?