学习笔记
单纯记录在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编译动态库以及使用就这样完成了。
哈哈!!!