【问题标题】:How to write "or" inside dependencies in makefile?如何在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,这只是一个“或”的问题。

标签: c++ c makefile


【解决方案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)))
猜你喜欢
  • 2013-04-27
  • 2016-09-14
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2021-10-03
  • 1970-01-01
  • 2019-05-08
相关资源
最近更新 更多