我正在尝试编写一个makefile,它使用宏一次从多个文件创建多个可执行文件。我试着通过以前回答的问题进行搜索,但是因为我对使用gcc编程以及使用gcc进行编程相当新,所以我无法找到问题的答案。
这是我到目前为止所做的:
CC=gcc
CFLAGS=-I.
OBJ = ex1.c ex3.c
EXECUTABLE = ex1 ex3
$(EXECUTABLE): $(OBJ)
gcc -o $@ $^ $(CFLAGS)
clean:
rm -f $(EXECUTABLE)
我想要一行
$(EXECUTABLE): $(OBJ)
分别从文件ex1.c ex3.c创建可执行文件ex1和ex3。
答案 0 :(得分:15)
对于这种特殊情况,每个可执行文件都有一个扩展名为.c
的源文件,您只需要一行Makefile:
all: ex1 ex3
make
的内置默认规则已经有效:
$ make
cc -O2 -pipe ex1.c -o ex1
cc -O2 -pipe ex3.c -o ex3
在幕后,make
正在使用POSIXly mandated built-in single suffix rule
.c:
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
使用make CC=gcc CFLAGS=-O2 LDFLAGS=-s
和类似的方式改变您喜欢的命令。
当天的琐事:事实上,如果你愿意在调用make
,时命名目标,你可以使用空的甚至运行而不用任何Makefile:< /强>
$ make -f /dev/null CC=gcc CFLAGS=-O2 LDFLAGS=-s ex1 ex3
gcc -O2 -s ex1.c -o ex1
gcc -O2 -s ex3.c -o ex3
$ rm -f Makefile ex1 ex3
$ make CC=gcc CFLAGS=-O2 LDFLAGS=-s ex1 ex3
gcc -O2 -s ex1.c -o ex1
gcc -O2 -s ex3.c -o ex3
制造魔法!
根据经验,不要重新发明轮子(或规则),使用已经存在的规则。它简化了你的生活并使生活变得更加美好。这使得小巧而性感的文件可以给女士留下深刻的印象: - )
答案 1 :(得分:2)
一些建议(假设你使用 GNU make,而不是别的东西)
首先,运行一次make -p
,您就会明白内置规则make
知道什么。请特别关注COMPILE.c
和LINK.c
然后,我建议
CFLAGS= -g -Wall -I.
(因为你真的希望-g
进行调试,-Wall
得到大多数警告)
你可能不需要
$(EXECUTABLE): $(OBJ)
gcc -o $@ $^ $(CFLAGS)
但是,我建议在大多数其他规则之前添加
.PHONY: all clean
all: $(EXECUTABLES)
实际上,我会将您的Makefile
(对于 GNU make
!)进行编码,如下所示
# file Makefile
CC= gcc
RM= rm -vf
CFLAGS= -Wall -g
CPPFLAGS= -I.
SRCFILES= ex1.c ex2.c ## or perhaps $(wildcard *.c)
OBJFILES= $(patsubst %.c, %.o, $(SRCFILES))
PROGFILES= $(patsubst %.c, %, $(SRCFILES))
.PHONY: all clean
all: $(PROGFILES)
clean:
$(RM) $(OBJFILES) $(PROGFILES) *~
## eof Makefile
请记住,标签是Makefile
- s中的重要字符(rules的操作部分)。在这个答案中,至少以四个空格开头的行应该以 tab 字符开头。
调试完所有内容后,请考虑运行make clean
来清理所有内容,然后make -j CFLAGS=-O2 all
并行编译并优化所有内容。
最后,我建议使用remake
并运行remake -x
来调试复杂Makefile
- s
当然,我假设您的目录只有单个文件程序。
顺便说一句,还有其他建设者计划。也许您可以考虑omake不要忘记为源文件使用git之类的版本控制系统。现在也是学习这种工具的时候了。
答案 2 :(得分:1)
你很接近,但你需要一个模式规则:
$(EXECUTABLE): % : %.c
然后是一个默认规则,使其同时构建:
all: $(EXECUTABLE)
答案 3 :(得分:0)
以下答案包括多个可执行文件,例如,init,process1,process2,...,process4。
LOCAL_INCLUDE=./
all: clean process_first process_second init
process_first:
gcc -g -o process1 -I$(LOCAL_INCLUDE) process1.c -lzmq -L. -L./.
gcc -g -o process2 -I$(LOCAL_INCLUDE) process2.c -lzmq -L. -L./.
process_second:
gcc -g -o process3 -I$(LOCAL_INCLUDE) process3.c -lzmq -L. -L./.
gcc -g -o process4 -I$(LOCAL_INCLUDE) process4.c -lzmq -L. -L./.
init:
gcc -g -o initiate -I$(LOCAL_INCLUDE) initiate.c -lzmq -lconfig -lpthread -L. -L./. -ldl -lrt
clean:
rm -rf init_manager.o init_manager
rm -rf process1 process2 process3 process4
注意:最好在重新制作之前清理并触摸所有可执行文件。