Skip to main content

makefile

在实际开发中,项目的源代码文件比较多,按类型、功能、模块分别存放在不同的目录和文件中,哪些文件需要先编译,那些文件后编译,那些文件需要重新编译,还有更多更复杂的操作。 make是一个强大的实用工具,用于管理项目的编译和链接。make需要一个编译规则文件makefile,可实现自动化编译。

一、app/demo01.cpp

#include "public.h" // 包含通用函数和类的头文件。

#include "myapi.h" // 包含另一个通用函数和类的头文件。

using namespace std;

int main()

{

func(); // 调用通用的函数。

func1(); // 调用另一个通用的函数。

AA a; // 用通用类声明对象。

a.show(); // 调用对象的方法。

BB b; // 用另一个通用类声明对象。

b.show(); // 调用对象的方法。

}

二、app/makefile

INCLUDEDIR=-I/home/wucz/tools -I/home/wucz/api

LIBDIR=-L/home/wucz/tools -L/home/wucz/api

all:demo01 demo02 demo03

demo01:demo01.cpp

g++ -o demo01 demo01.cpp $(INCLUDEDIR) $(LIBDIR) -lpublic -lmyapi

cp demo01 /tmp/.

demo02:demo02.cpp

g++ -o demo02 demo02.cpp $(INCLUDEDIR) $(LIBDIR) -lpublic -lmyapi

demo03:demo03.cpp

g++ -o demo03 demo03.cpp $(INCLUDEDIR) $(LIBDIR) -lpublic -lmyapi

clean:

rm -f demo01 demo02 demo03

三、tools/public.h


// 通用函数和类的头文件。

#include <iostream>

// 声明一个通用的函数。

void func();

// 声明一个通用的类。

class AA

{

public:

void show();

};

四、tools/public.cpp

// 通用函数和类的代码实现文件。

#include "public.h"

using namespace std;

// 通用函数的代码实现。

void func()

{

cout << "升级了调用了func()函数。\n";

}

// 通用类的代码实现。

void AA::show()

{

cout << "升级了我是一只傻傻鸟。\n";

}

五、tools/makefile

# 指定编译的目标文件是libpublic.a和libpublic.so

all:libpublic.a \

libpublic.so

# 编译libpublic.a需要依赖public.h和public.cpp

# 如果被依赖文件内容发生了变化,将重新编译libpublic.a

libpublic.a:public.h public.cpp

g++ -c -o libpublic.a public.cpp

libpublic.so:public.h public.cpp

g++ -fPIC -shared -o libpublic.so public.cpp

# clean用于清理编译目标文件,仅在make clean才会执行。

clean:

rm -f libpublic.a libpublic.so

六、api/myapi.h

// 另一个通用函数和类的头文件。

#include <iostream>

// 声明一个通用的函数。

void func1();

// 声明一个通用的类。

class BB

{

public:

void show();

};

七、api/myapi.cpp

// 另一个通用函数和类的代码实现文件。

#include "myapi.h"

using namespace std;

// 通用函数的代码实现。

void func1()

{

cout << "调用了func1()函数。\n";

}

// 通用类的代码实现。

void BB::show()

{

cout << "你是一只傻傻鸟。\n";

}

八、api/makefile

# 指定编译的目标文件是libmyapi.a和libmyapi.so

all:libmyapi.a libmyapi.so

# 编译libmyapi.a需要依赖myapi.h和myapi.cpp

# 如果被依赖文件内容发生了变化,将重新编译libmyapi.a

libmyapi.a:myapi.h myapi.cpp

g++ -c -o libmyapi.a myapi.cpp

libmyapi.so:myapi.h myapi.cpp

g++ -fPIC -shared -o libmyapi.so myapi.cpp

# clean用于清理编译目标文件,仅在make clean才会执行。

clean:

rm -f libmyapi.a libmyapi.so