[c++] Makefile is a good start.

以两个链接打开序幕,镇楼。

c++神之博客链表:那些C++牛人的博客

各个branch的学习指导:程序员技术练级攻略

 

A Simple Makefile Tutorial

Official menu: GNU make

Ref: 山寨内核Makefile之“天龙八部”

 

一个简单例子:

CC=gcc
CFLAGS=-I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o 

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS)

 

一个复杂例子:

IDIR=../include
CC=gcc
CFLAGS=-I$(IDIR)  #指定了头文件

ODIR=obj
LDIR=../lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

 

如果.cpp在不同的目录级别呢?也就是:多个文件目录下Makefile的写法

From: 多文件工程的编译-Makefile的简便写法

CC = gcc
CFLAGS = -Isub -Iadd -O2  
OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
TARGET = cacu
RM = rm -f
$(TARGET):$(OBJS)
  $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)
$(OBJS):%.o:%.c
  $(CC) -c $(CFLAGS) $< -o $@
clean:
  -$(RM) $(TARGET) $(OBJS)

  

一个原始的"笨"写法:

#生成test,":"左边为目标,右边为依赖 。gcc后是命令
cacu:add_int.o add_float.o sub_int.o sub_float.o main.o
    gcc -o cacu add/add_int.o add/add_float.o \ (连接符)
            sub_int.o sub_float.o main.o 
#生成add_int.o的规则
add_int.o:add/add_int.c add/add_int.h
    gcc -c -o add/add_int.o add/add_int.c 
#生成add_float.o的规则
add_float.o:add/add_float.c add/add_float.h
    gcc -c -o add/add_float.o add/add_float.c
#生成sub_int.o的规则
sub_int.o:sub/sub_int.c sub/sub_int.h
    gcc -c -o sub/sub_int.o sub/sub_int.c
#生成sub_float.o的规则
sub_float.o:sub/sub_float.c sub/sub_float.h
    gcc -c -o sub/sub_float.o sub/sub_float.c
#生成main.o的规则
main.o:main.c add/add.h sub/sub.h
    gcc -c-o main.o main.c -Iadd -Isub
#清理的规则
clean:
    rm -f test add_int.o add_float.o sub_int.o \
            sub_float.o main.o

 

如果要写wraper,注意extern c,需要注释掉。

否则导致函数名因为重载机制而链接出问题。

 

posted @ 2015-03-17 18:18  郝壹贰叁  阅读(246)  评论(0编辑  收藏  举报