【发布时间】: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 当前目录