我有三个档案:program.cprogram.hheaders.h.

program.c包括program.hheaders.h.

我需要在Linux上用gcc编译器编译这个.我不知道该怎么做.Netbeans为我创建了一个,但它是空的.

推荐答案

有趣的是,我不知道make会默认使用C编译器给定的源文件规则.

无论如何,演示简单Makefile概念的简单解决方案是:

HEADERS = program.h headers.h

default: program

program.o: program.c $(HEADERS)
    gcc -c program.c -o program.o

program: program.o
    gcc program.o -o program

clean:
    -rm -f program.o
    -rm -f program

(bear in mind that make requires tab instead of space indentation, so be sure to fix that when copying)

然而,为了支持更多的C文件,您必须 for each 文件制定新的规则.因此,要改进:

HEADERS = program.h headers.h
OBJECTS = program.o

default: program

%.o: %.c $(HEADERS)
    gcc -c $< -o $@

program: $(OBJECTS)
    gcc $(OBJECTS) -o $@

clean:
    -rm -f $(OBJECTS)
    -rm -f program

我试图通过省略通常在makefiles中看到的$(CC)和$(CFLAGS)等变量来尽可能简单地实现这一点.如果你有兴趣搞清楚这一点,我希望我给了你一个良好的开端.

这是我喜欢用于C源代码的Makefile.请随意使用:

TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f *.o
    -rm -f $(TARGET)

它使用make实用程序的通配符和patsubst功能自动包含.c和.h文件,这意味着当您向目录中添加新代码文件时,不必更新Makefile.但是,如果要更改生成的可执行文件、库或编译器标志的名称,只需修改变量即可.

在这两种情况下,请不要使用autoconf.我求你了!:)

C++相关问答推荐

sscanf:如何解析

奇怪的print在getchar和getchar跳过后不工作

了解返回函数指针的函数定义

char为16位且Short也为16位的c环境合法吗

intellisense不工作,甚至已经下载了c/c++扩展

字符串令牌化xpath表达式

正在try 将文件/文件夹名从目录 struct 存储到链接列表

这是一个合法的C Strdup函数吗?

fwrite无法写入满(非常大)缓冲区

如何在c++中包装返回空*的函数

获取每个循环迭代结束时的当前时间

用C++从外部ELF符号读取值

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

为什么编译器不能简单地将数据从EDI转移到EAX?

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

Makefile无法将代码刷新到ATmega328p

C中的数组下标和指针算法给出了不同的结果

atoi函数最大长-长误差的再创造

函数指针作为函数参数 - 应该使用 const 吗?

nullptr_t 是否会 destruct 类型双关或指针转换?