因为我从makefile中得到的这个极其愚蠢的错误,我在这里的智慧结束了。 我终于放弃了将makefile剥离到两行:
%.o: %.c
gcc -c -o $@ $< -I../inc
命令:make。输出:
make: *** No targets. Stop.
开头的空格是真正的标签而不是空格。 c文件位于同一目录中。如果不是%.o而是我给,例如,file1.o和file1.c而不是%.c,一切都很好(file1.o被创建)。不过,我在网上看到了很多使用%运算符的例子。如果我包含一个干净的:目标,则会立即找到它,如下所示:
%.o: %.c
gcc -c -o $@ $< -I../inc
clean:
echo "this is clean!"
命令:make。输出:
echo "this is clean!"
this is clean!
请帮助我,因为我完全不知道我的目标有什么问题。在第二个样本(具有清洁目标的样本)中,我猜想找到干净的目标并采取行动,因为第一个样本是无效的&#39;不知。
答案 0 :(得分:1)
看起来你忘记写一个目标了。您刚刚编写了如何编译的规则,但不知道如何处理这些对象。我的意思是,我想念一下:
my_executable_file: *.o
gcc -o my_executable_file *.o
修改强>:
之前设置的是真的,您需要目标。但是,如您只想编译,您的目标应该是:
OBJECTS = file.o #and whatever objects you need, as a list separated by commas
然后你的目标:
my_objects: $(OBJECTS)
所以把它们放在一起:
OBJECTS = file.o #and whatever objects you need, as a list separated by commas
my_objects: $(OBJECTS)
%.o: %.c
gcc -c -o $@ $< -I../inc
答案 1 :(得分:0)
下面是Makefile,它将支持任意数量的目标编译
OBJ := file.o
all: $(OBJ)
%.o: %.c
gcc -c -o $@ $< -I../inc
clean:
echo "this is clean!"
这里, OBJ 将是您要编译的文件列表,就像这里是file.c一样。
将要编译的文件名添加到OBJ,当调用make时,它将首先构建目标 all ,这取决于 OBJ 。
要构建 OBJ ,请使用 gcc 命令。
答案 2 :(得分:0)
如果没有给 make 显式目标,则使用Makefile中的第一个(非模式?)目标。在上面的例子中,它是干净目标。
答案 3 :(得分:0)
我认为你打算只制作.o
个文件(创建图书馆时可能需要这些文件)
您可以修改Makefile
以构建仅 .o
个文件,或使用相同的Makefile
构建 可执行文件
对于以下目录结构(使用tree
命令)
# tree .
.
|-- include
| `-- head.h
|-- Makefile
|-- obj
`-- src
`-- main.c
Makefile
# GNU Makefile #
# Some Variables #
CC := gcc
RM := rm
MV := mv
# Phony Targets #
.PHONY: clean
.PHONY: move
# Path for Source, Object and Include #
SRC_PATH := ./src/
OBJ_PATH := ./obj/
INCLUDE_PATH := ./include/
# Source and Object File Names #
SRC := $(SRC_PATH)main.c
OBJ := $(SRC:c=o) # Substitutes all SRC but with .c as .o (main.c becomes main.o) #
# Executable Name #
TARGET := exe
# Building Binary - use 'make' #
binary: $(TARGET) move
$(TARGET): $(OBJ)
$(CC) -o $(TARGET) $^
# Building only Object Files - use 'make object_only' #
object_only : $(OBJ) move
$(OBJ): $(SRC)
$(CC) -c -o $@ $< -I $(INCLUDE_PATH)
# This rule is for moving .o files to ./obj directory (More Organised) #
move:
$(MV) $(SRC_PATH)*.o $(OBJ_PATH)
# For Cleaning - use 'make clean' #
clean:
echo "Cleaning Up!"
$(RM) -rfv $(TARGET) $(OBJ_PATH)*.o $(SRC_PATH)*.o # Delete .o and executable #
执行:
仅构建目标文件使用
$ make object_only
要构建目标文件和可执行文件,请使用
$ make