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 $@
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
/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)
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