添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

去年做项目的时候,由于有需要编译出多个可执行文件的需求,修改了Makefile使其支持生成多个结果(编译多个含有main函数的文件),但总觉得自己的实现不够完美。

今年又遇到这样需求的时候,可在网上找了一圈,发现没有找到能够同时编译得到多个结果的Makefile模板。

可以发现,其中,seeker.c 以及 main.c 中都有 main函数,如果按照以往的编译方式,是会引起冲突的

如果将编译的文件写死而引起的不便又违背了make简洁的初衷,那么本人是怎么解决这样的问题的呢?

解决方法:

其实很简单,只需要

1.在包含main函数的.c文件中,头尾加上条件宏

2.在makefile中的编译规则中指定-D选项(条件编译)

这样一来,当make时,其他包含了main的宏由于条件编译而变成了空文件,自然便不会引起多重main函数编译冲突了。

以下是本人的makefile,希望各路大神批评指正。如果有更好的实现,请告知我,谢谢。

模板与demo的网址: https://gitee.com/schips/common_code_for_my_self/tree/master/makefile/makefile_for_apps

$ cat Makefile

# 添加所有的.c文件
SRCS = $(wildcard src/*.c) 
OBJS = $(SRCS:.c = .o)
# 指定 头文件目录
INCLUDES = -I ./inc
# 指定库目录
LIBS = -L ./lib
# 指定编译器
CC = gcc
# 指定编译选项(可选)
CCFLAGS = -g -Wall -O0
# 编译目标列表
OUTPUT1 = target1
OUTPUT2 = target2
# ...
OUTPUTLIST=$(OUTPUT1) $(OUTPUT2)

# 将 所有的目标作为一个列表,便于make clean all : $(OUTPUTLIST) # 编译目标1 $(OUTPUT1) : $(OBJS) @$(CC) $^ -o $@ $(INCLUDES) $(LIBS) -D_$(shell echo $(@)|tr a-z A-Z)_ $(OUTPUT2) : $(OBJS) @$(CC) $^ -o $@ $(INCLUDES) $(LIBS) -D_$(shell echo $(@)|tr a-z A-Z)_ %.o : %.c @$(CC) -c $< $(CCFLAGS) clean: @rm $(OUTPUTLIST) .PHONY:clean

注:红色的处只是为了使得宏与OUTPUT x 的名字保持一致,且不是小写形式(习惯上,宏使用大写),这样一来就不需要修改过多的东西就很方便了。

项目中使用到的2个带有main函数的文件头部(文件最后一行都是 #endif)

背景:  去年做项目的时候,由于有需要编译出多个可执行文件的需求,修改了Makefile使其支持生成多个结果(编译多个含有main函数的文件),但总觉得自己的实现不够完美。  今年又遇到这样需求的时候,可在网上找了一圈,发现没有找到能够同时编译得到多个结果的Makefile模板。目录结构可以发现,其中,seeker.c 以及 main.c 中都有 main函数,如果按照以...
包含 main .c、a.c、b.c、 makefile 。 其中,在 main .c中使用a.c和b.c中的 函数 makefile 文件使用了变量和模式规则,是一份兼容性很强的代码指令,若要 编译 其它源文件,只需在SRCS变量后面修改即可。 1、在源码路径下的终端中输入 make 即可运行 makefile 。 2、输入make clean可以清除所有 生成 的.o文件。
target: main .o 1.o 2.o 3.o 4.o 5.o #target是要 生成 的目标文件,后面 main .o是主文 件,其他是依赖文件。 gcc -o target main .o 1.o 2.o
1.写在前面最近弄Linux编程,自己写 Makefile 编译 代码。产生了2个需求:1.一个 Makefile 编译 链接 多个 .c或.cpp文件, 生成 多个 可执行程序;2.一个 Makefile 编译 链接 多个 .c或.cpp文件,只 生成 一个可执行程序。今天只说第1个需求。2. Makefile 网上讲 Makefile 文章很多,我这就不耍大刀了。 直接来Makefiel代码:CC = g++ C_FLAGS = -
第一章:1-10、试在下列条件下比较电路交换和分组交换。要传送的报文共x(bit),从源站到目的站共经过k段链路,每段链路的传播时延为d(s),数据率为C(bit/s)。在电路交换时电路的建立时间为s... 26996