一个简陋的makefile

7 篇文章 0 订阅
DR=debug
Target=main


all:$(Target)


Sources:=$(shell ls *.cpp)
Sources+=$(shell ls ./part1/*.cpp)
Objs:=$(Sources:.cpp=.o)


CXXFLAGS=-Wall
ifeq ($(DR),release)
CXXFLAGS=-O
endif
CXXFLAGS+=-g -std=c++11


INCLUDE = -I. -I/usr/include -I/usr/include/c++/4.8.2

LIBS = -L. -L/usr/lib -L/lib64

CC=g++



print:
	@echo sources:$(Sources)
	@echo objs:$(Objs)
	@echo includes:$(INCLUDE)
	@echo lib:$(LIBS)
	@echo cxxflags:$(CXXFLAGS)
	@echo DR:$(DR)
	@echo target:$(Target)
	@echo CC:$(CC)




$(Target):$(Objs)
	$(CC) -o $(Target) $(Objs) $(LIBS)
$(Objs):%.o:%.cpp
	$(CC) -c $(INCLUDE) $(CXXFLAGS) $< -o $@




clean:
	rm -rf *.o
	rm -rf ./$(Target)
	cd ./part1; rm -rf *.o



这个makefile我用了一天时间写出来的, 说出来大家笑话了~!

我是看了http://blog.csdn.net/ruglcc/article/details/7814546/这个帖子后学者写的。期间出了不少问题,我在群里问大神的时候,人家甚至都说:你这是makefile?可能是我在文件头一开始加了#!/bin/sh的原因吧。


下面先说几个注意事项:

  • 在使用ifeq的时候,一定要记住ifeq (),ifeq和(之间要有一个空格,否则会报*** missing separator.  Stop.
  • 在使用命令的时候,先要第一行为xx:yy,然后第二行使用tab键打头再写命令,如echo和$(CC)

我浪费了一天的时候在这个makefile上,问题并不是上面的2个注意事项,说来汗颜。
我一开始是这样写的:
 43   $(Objs):%.o:$(Sources)
 44     $(CC) -c $(INCLUDE) $(CXXFLAGS) $< -o $@
跟上面的makefile比对一下就发现,line-43后面应该是%.cpp而不是$(Sources),我擅自把%.cpp改成$(Sources),结果时间都浪费在这了,错误提示是:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 21
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [main] Error 1
这个问题看起来着实让人郁闷,上面的错误输出还只是一部分。
使用$(Objs):%.o:$(Sources)编译出来的*.o文件用命令nm查看,是空集。

-------
现在来说说这个makefile
这个文件现在只处理cpp文件,可以包含目录,如:
  8 Sources:=$(shell ls *.cpp)
  9 Sources+=$(shell ls ./part1/*.cpp)
 10 Objs:=$(Sources:.cpp=.o)
在代码里使用这个makefile的时候,在这里手动设置下代码目录

第二个需要自己手动指定自定义的Include/l ib/cxxflags

第三个就是这个makefile接收2个命令行参数,一个是DR,一个Target
DR用来指定debug/relase, Target是用来指定目标名称的

代码文件和makefile在:http://pan.baidu.com/s/1qWjyRW4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值