一 编译需要的文件
1 file1.h
#ifndef FILE1_H_
#define FILE1_H_
#ifdef __cplusplus
extern "C" {
#endif
void File1Print();
#ifdef __cplusplus
}
#endif
#endif
2 file1.cpp
#include <iostream>
#include "file1.h"
using namespace std;
void File1Print(){
cout<<"Print file1**********************"<<endl;
}
3 file2.cpp
#include <iostream>
#include "file1.h"
using namespace std;
int main(){
cout<<"Print file2**********************"<<endl;
File1Print();
return 0;
}
二 makefile中使用函数
CC = gcc
XX = g++
CFLAGS = -Wall -O -g
TARGET = helloworld
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o:%.cpp
$(XX) $(CFLAGS) -c $< -o $@
SOURCES = $(wildcard *.c *.cpp)
OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
$(TARGET) : $(OBJS)
$(XX) $(OBJS) -o $(TARGET)
clean:
rm -rf *.o helloworld
三 编译
[root@localhost 0405]# make
g++ -Wall -O -g -c file1.cpp -o file1.o
g++ -Wall -O -g -c file2.cpp -o file2.o
g++ file1.o file2.o -o helloworld
[root@localhost 0405]# ll
total 100
-rw-r--r--. 1 root root 140 May 1 08:52 file1.cpp
-rw-r--r--. 1 root root 170 May 1 08:52 file1.h
-rw-r--r--. 1 root root 26488 May 11 09:43 file1.o
-rw-r--r--. 1 root root 167 May 1 08:52 file2.cpp
-rw-r--r--. 1 root root 24136 May 11 09:43 file2.o
-rwxr-xr-x. 1 root root 31520 May 11 09:43 helloworld
-rw-r--r--. 1 root root 328 May 1 08:52 Makefile
四 说明
1 $(wildcard PATTERN...):在makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以.c、.cpp结尾的文件列表,然后存入变量SOURCES里。
2 patsubst函数,用于匹配替换,有3个参数。第一个是一个需要匹配的样式,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分割的列表。比如:$(patsubst %.c %o,$(dir)),是指把$(dir)中符合后缀是 .c的全部替换为.o。OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))的意思是把文件列表中所有.c、.cpp字符变成.o,形成一个新的文件列表,然后存入OBJS变量中。
3 下面几句表示把所有的.c和.cpp文件编译成.o文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o:%.cpp
$(XX) $(CFLAGS) -c $< -o $@
$@:扩展成当前规则的目的文件名。
$<:扩展成依靠列表中的第1个依靠文件。
$^:扩展成整个依靠的列表。