【问题标题】:Make remove directory from every path in array从数组中的每个路径中删除目录
【发布时间】:2015-11-25 18:09:46
【问题描述】:

到目前为止,我一直在用一个 shell 脚本编译我的 c 和 c++(以及一个小 glsl)项目,即使我想做一个小的、简单的改变,它也会重新编译整个东西。它开始需要将近 5 秒。我无法忍受,所以我转向 Makefiles。到目前为止,我认为我的 Makefile 很好,除了一个问题:当我将我的 CSOURCES 转换为 COBJECTS 时,我没有删除源文件所在的目录,所以我得到了这些错误:

clang: error: no such file or directory: 'lib/key_store.o'
clang: error: no such file or directory: 'lib/logger.o'
clang: error: no such file or directory: 'lib/myglutils.o'

这是生成文件:

CC=gcc
CPPC=g++
CCFLAGS=-std=c11 -Wall -pedantic
CPPFLAGS=-std=c++11 -Wall -pedantic
INC=-Iinclude/
LDFLAGS=lib/libGLEW.a lib/libglfw3.a -framework OpenGL -framework CoreVideo -framework Cocoa -framework IOKit
CSOURCES=$(wildcard lib/*.c)
COBJECTS=$(CSOURCES:.c=.o)
CPPSOURCES=$(wildcard *.cpp)
CPPOBJECTS=$(CPPSOURCES:.cpp=.o)
TARGET=Ultra-Fighters

all: $(TARGET)

$(TARGET): $(COBJECTS) $(CPPOBJECTS)
    $(CPPC) -o $@ $^ $(LDFLAGS)

%.o: %.cpp %.hpp
    $(CPPC) $(CPPFLAGS) $(INC) -c $<

%.o: %.cpp
    $(CPPC) $(CPPFLAGS) $(INC) -c $<

%.o: %.c %.h
    $(CC) $(CFLAGS) $(INC) -c $<

%.o: %.c
    $(CC) $(CCFLAGS) $(INC) -c $<

clean:
    rm -f *.o

我的问题是:当我分配给COBJECTS 时,如何从CSOURCES 中删除路径的目录部分?

【问题讨论】:

  • 链接的副本和vpath 都不是这里的直接答案。尽管vpath 在其他方面很可能是一个很好的答案。这里的正确答案可能是$(notdir) 函数。
  • @EtanReisner 我试过了,但我认为我用错了,我将如何在这一行中使用它:COBJECTS=$(CSOURCES:.c=.o)?
  • @EtanReisner 可能是我判断得太快了。重新打开以给您提供答案或标记更好的副本的空间。
  • 您希望在lib 下的.c 文件创建的目标文件在lib/ 下创建,还是像现在一样在当前目录中创建它们?
  • @EtanReisner 当前目录

标签: makefile gnu-make


【解决方案1】:

notdir 是您问题的直接解决方案。

【讨论】:

  • 如果那是目标,那不是黑客攻击。这就是该功能的用途。这就是为什么我在最初的评论中这么说的原因。这是否是正确的解决方案是另一个问题。
  • 我知道这是要使用的命令,但我不知道如何在这种情况下使用它:COBJECTS=$(CSOURCES:.c=.o)
猜你喜欢
  • 2011-07-15
  • 2021-01-30
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
相关资源
最近更新 更多