linux C++ make 实战--建立一个最简单的工程

22 篇文章 0 订阅

参考:http://www.cnblogs.com/ycloneal/p/5230266.html

一个文件夹下面有list.cpp,list.h,Node.cpp,Node.h,主函数在test.cpp文件下面,最简单的makefile文件可以写成:

CXXFLAGS =    -O2 -g -Wall -fmessage-length=0
CFLAGS = `pkg-config --cflags lcm`
LDFLAGS=`pkg-config --libs lcm`\
        -lpthread
OBJS = test.o    \
list.o    \
Node.o
TARGET =    test
$(TARGET):    $(OBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
 test.o: test.cpp 
$(CXX) $(CFLAGS) -I. -o $@ -c $<
  list.o: list.cpp 
$(CXX) $(CFLAGS) -I. -o $@ -c $<
  Node.o: Node.cpp
$(CXX) $(CFLAGS) -I. -o $@ -c $<
  all: $(TARGET)
  clean:
rm -f $(OBJS) $(TARGET)

其中CXXFLAGS是编译参数变量,CXX是makefile内置变量,CXX默认表示g++(C++编译器)。这个makefile的有两个功能:①编译代码,将test.cpp,list.cpp,Node.cpp编译成test.o,list.o,Node.o并链接成test可执行文件;②清除项目,当项目需要重新编译或整理时,使用make clean命令即可清除生的OBJS和TARGET变量中的名称。

示例代码中出现了变量,makefile中变量采用$(变量)的方法使用,如$(TARGET)即表示test。该makefile的目的是生成名为test的可执行文件,即$(TARGET),它的依赖文件是$(OBJS)所代表的test.o、list.o、Node.o三个文件。由于这三个文件都未生成,故针对每一个文件都需要进行编译生成,所以有三个.o文件为目标的makefile语句。

文中特殊字符说明如下:$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。比如在如下的代码中,$@代表test.cpp,$<代表第一个依赖文件,也就是test.cpp。

test.o: test.cpp 
    $(CXX) $(CFLAGS) -I. -o $@ -c $<


也可以使用自动推导功能, 使用makefile的自动推导功能,只要依赖关系中有.o文件,它会自动添加同名称的.c文件作为依赖文件,并由$(CXX) -o example.o可以自动推导出$(CXX) -o example.c。

$(TARGET):    $(OBJS)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)
如下所示:

CXXFLAGS =    -O2 -g -Wall -fmessage-length=0

OBJS =	test.o\
	list.o\
	Node.o



TARGET =    test

$(TARGET):	$(OBJS)
	$(CXX) -o $(TARGET) $(OBJS) $(LIBS)

all:	$(TARGET)

clean:
	rm -f $(OBJS) $(TARGET)



如果需要添加头文件,那么注意尽量不要使用makefile的自动推导功能,否则可能找不到头文件,则只需添加和修改如下代码:

CXXFLAGS =    -O2 -g -Wall -fmessage-length=0

OBJS =	test.o\
	list.o\
	Node.o

HEADER_DIR = 

TARGET =    test

$(TARGET):	$(OBJS)
	$(CXX) -o $(TARGET) $(OBJS) $(LIBS)

all:	$(TARGET)

clean:
	rm -f $(OBJS) $(TARGET)

$(TARGET):    $(OBJS)
	$(CXX) $(HEADER_DIR) $(OBJS) -o $(TARGET)  $(LIBS)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值