尝试创建* .o时出错

时间:2014-08-22 08:34:34

标签: c makefile

因为我从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;不知。

4 个答案:

答案 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