ubuntu 使用makefile编译c++静态库

学习笔记

单纯记录在ubuntu使用过程

使用C++编写一个静态库,头文件与CPP文件分开文件夹放置

一、编译静态库

1、目录结构:
在这里插入图片描述
最终会把编译好的静态库(libmytest.a)放置到lib目录下

2、先确认好库使用声明的.h文件实现,声明两个简单的函数做两个数值的加或减(别在意函数名这细节0.0)

./inclyude/Test.h
#ifndef __Test_h
#define __Test_h

int lib_func_add(int,int);
int lib_func_del(int,int);

#endif

单纯的做一下声明。

3、将Test.h文件下的两个函数分在两个cpp实现(这个看自己喜欢)

./src/lib_add.cpp
#include "Test.h"
#include <iostream>
using namespace std;

int lib_func_add(int a,int b)
{
        int res = a+b;
        cout<<"in a static library,return value is "<<res<<endl;
        return res;
}
./src/lib_del.cpp
#include "Test.h"
#include <iostream>
using namespace std;

int lib_func_del(int a,int b)
{
        int src = a - b;
        cout<<"in a static library,return value is "<<src<<endl;
        return src;
}

4、代码声明与实现已经准备就绪了,下面就编写makefile文件了。

关于Makefile介绍

常见变量:

all

这个伪目标是所有目标的目标,其功能一般是编译所有的目标

clean

这个伪目标功能是删除所有被make创建的文件

vpath

%.h include //指定.h类型文件的搜索路径是include
%.cpp src //指定.cpp类型文件的搜索路径是src

CC

C语言编译程序。默认命令是“cc”

CXX

C++语言编译程序。默认命令是“g++”

CFLAGS

C语言编译器参数

CXXFLAGS

C++语言编译器参数

INCLUDE

指明头文件的路径

LIBPATH

常用于链接时配合LDFLAGS链接动态库,LIBS指明动态库名称,LDFLAGS指出动态库路径

LIBVAR

用于指定连接的lib库文件

SRCS

指代项目中的源文件

OBJS

指代项目中的目标文件

TARGET

指代项目中的可执行文件

经过以上的介绍,那么就使用这些值把makefile实现。

makefile
CC      = gcc
CFLAGS  = 
CXXFLAGS= -Wall -O -g
INCLUDE = -I ./include
TARGET  = libmytest.a
LIBPATH = ./lib/

vpath %.h ./include
vpath %.cpp ./src

OBJS    =lib_add.o lib_del.o
SRCS    =lib_add.cpp lib_del.cpp

$(OBJS):$(SRCS)
        $(CC) $(CFLAGS) $(INCLUDE) -c $^

all:$(OBJS)
        ar rcs $(TARGET) $^
        mv $(TARGET) $(LIBPATH)
clear:
        rm -f *.o
        rm -f $(LIBPATH)*

-Wall 是打开警告开关,-O代表默认优化,可选:-O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化。
-g是生成调试信息,生成的可执行文件具有和源代码关联的可调试的信息。

5、执行make,生成.o文件(可省略此步骤)
在这里插入图片描述

6、在执行 make all,生成库文件
在这里插入图片描述
在lib目录下生成libmytest.a库文件
在这里插入图片描述

7、执行 make clear,清除所有编译文件
在这里插入图片描述

二、使用编译好的静态库

实现在编译好的静态库的基础上使用此库
1、以下是目录结构,在库目录的上级目录增加main.cpp和makefile文件
在这里插入图片描述

2、main.cpp
#include <iostream>
#include "Test.h"

using namespace std;

int main()
{
        int nAdd = 0;
        int nDel = 0;
        nAdd = lib_func_add(1,1);
        nDel = lib_func_del(12,5);
        cout<<"Test lib func_add is Value = "<<nAdd<<endl;
        cout<<"TEst lib func_del is value = "<<nDel<<endl;
        cout<<"Exit main"<<endl;
        return 0;
}

3、makefile
CC      = gcc
CFLAGS  =
CXXFLAGS= -Wall -O -g
INCLUDE = -I ./Library/include
TARGET  = main
LIBVAR  = -lmytest
LIBPATH = -L ./Library/lib

vpath %.h ./Library/include

OBJS    = main.o
SRCS    = main.cpp

$(OBJS):$(SRCS)
        $(CC) $(CFLAGS) $(INCLUDE) -c $^

all:$(OBJS)
        cd ./Library && make all
        $(CC) $(CFLAGS) $(INCLUDE) -o main  $(OBJS) $(LIBPATH) $(LIBVAR) -lstdc++

clear:
        rm -f *.o
        rm -f $(TARGET)
        cd ./Library && make clear

注:c++ 编译可执行文件时必须加上-lstdc++ ,不然gcc会默认使用C格式去编辑,导致出错

其中cd ./Library && make all 和 cd ./Library && make clear 是先执行/Library目录下的make

4、执行make,生成.o文件(可省略此步骤)
在这里插入图片描述

5、在执行 make all,生成可执行文件
在这里插入图片描述

可见

make[1]: Entering directory ‘/home/work/code/TestMakefile/Library’
gcc -I ./include -c ./src/lib_add.cpp ./src/lib_del.cpp
ar rcs libmytest.a lib_add.o lib_del.o
mv libmytest.a ./lib/
make[1]: Leaving directory ‘/home/work/code/TestMakefile/Library’

进入/Library目录下执行make all 然后再退出。

6、输入./main运行可执行文件(可执行文件名称根据自己喜欢修改,在makefile指定的)
在这里插入图片描述

一个简单的makefile编译动态库以及使用就这样完成了。

哈哈!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值