经过一些搜索,我成功地将以下Makefile放在一起:
CC = gcc
CFLAGS = -c -Wall
LDFLAGS =
SOURCEFILES = main.c
SOURCES = src/$(SOURCEFILES)
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = netsim
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.c.o:
$(CC) $(CFLAGS) $< -o $@
clean:
rm -rf netsim $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)
我希望能够将我的目标文件移动到另一个目录中,但一直在努力使其工作.我错过了什么?
诀窍是不要移动你的对象.
您应该构建它并在构建它们的地方使用它.
例如,您具有以下目录结构:
$ tree .
??? Makefile
??? include
? ??? common_head.h
??? obj
??? src
??? foo.c
??? main.c
Run Code Online (Sandbox Code Playgroud)
手动执行:
$ gcc -o ./obj/foo.o -c ./src/foo.c -I ./include # Build Object #
$ gcc -o ./obj/main.o -c ./src/main.c -I ./include
$ gcc -o exe ./obj/foo.o ./obj/main.o # Build Executable #
Run Code Online (Sandbox Code Playgroud)
Makefile来模拟上面的内容
C_FLAGS := -g -Wall -Wextra
CC := gcc
RM := rm
LINKFLAGS := -lanylibrary
.PHONY: $(TARGET)
.PHONY: clean
VPATH:= ./src/ ./obj/ ./include/
# Path for .c , .h and .o Files
SRC_PATH := ./src/
OBJ_PATH := ./obj/
INC_PATH := -I ./include
# Executable Name
TARGET := exe
# Files to compile
OBJ1 := foo.o \
main.o
OBJ := $(patsubst %,$(OBJ_PATH)%,$(OBJ1))
# Build .o first
$(OBJ_PATH)%.o: $(SRC_PATH)%.c
@echo [CC] $<
@$(CC) $(C_FLAGS) -o $@ -c $< $(INC_PATH)
# Build final Binary
$(TARGET): $(OBJ)
@echo [INFO] Creating Binary Executable [$(TARGET)]
@$(CC) -o $@ $^ $(LINKFLAGS)
# Clean all the object files and the binary
clean:
@echo "[Cleaning]"
@$(RM) -rfv $(OBJ_PATH)*
@$(RM) -rfv $(TARGET)
Run Code Online (Sandbox Code Playgroud)
所以,当你做一个Make
$ make -B
[CC] src/foo.c
[CC] src/main.c
[INFO] Creating Binary Executable [exe]
Run Code Online (Sandbox Code Playgroud)
看干运用 make -n
$ make clean ; make -n
g++ -g -Wall -Wextra -o obj/foo.o -c src/foo.c -I ./include
g++ -g -Wall -Wextra -o obj/main.o -c src/main.c -I ./include
g++ -o exe obj/foo.o obj/main.o -lanylibrary
Run Code Online (Sandbox Code Playgroud)
因此,在构建目录结构后,应该如下所示.
$ tree .
??? Makefile
??? exe
??? include
? ??? common_head.h
??? obj
? ??? foo.o
? ??? main.o
??? src
??? foo.c
??? main.c
Run Code Online (Sandbox Code Playgroud)
从我之前的回答.
您不必使用任何PHONY move对象,也不会不必要地重新创建对象.
| 归档时间: |
|
| 查看次数: |
7517 次 |
| 最近记录: |