红联Linux门户
Linux帮助

编译基础—如何用g++编译自己的库,以及一个简单的makefile文件

发布时间:2016-09-18 11:38:38来源:linux网站作者:jiangwei0512
1.首先写一个自己的库:
#include "../MyAPI.h"  
#include <cstdlib>  
#include <ctime>  
int getRandom(int boundary)  
{  
if (boundary <= 0 )  
{  
return 0;  
}  
srand((unsigned)time(NULL));      
return rand() % boundary;  
}
这里的MyAPI.h是库对应的头文件(这里用../MyAPI.h是因为库文件源代码在lib目录下,而头文件跟lib目录在同级目录):
int getRandom(int boundary);  
 
2.接着要编译这个库,在这之前需要将源文件编译成.o文件:
编译基础—如何用g++编译自己的库,以及一个简单的makefile文件
 
3.之后再将.o文件打包成lib,在类Unix系统中,静态库是.a文件:
编译基础—如何用g++编译自己的库,以及一个简单的makefile文件
 
4.之后就是使用这个lib库了,下面是使用该库的源代码:
#include "basic.h"  
int main()  
{  
cout << getRandom(20) << endl;  
}  
 
5.源代码中只需要包含头文件就可以了,重点在于编译的时候,下面是编译命令:
编译基础—如何用g++编译自己的库,以及一个简单的makefile文件
这里需要注意两点:
1)-L参数指定包含lib的目录;-l指定lib名;
2)lib名也需要注意,名称是libMyAPI.a,但是使用时不需要加lib和.a后缀。
当然也可以不使用-L -l等选项,直接使用lib全称:
编译基础—如何用g++编译自己的库,以及一个简单的makefile文件
之后生成的a.out就可以使用了。
这里之所以提到-L和-l参数,原因是在写makefile时,-L和-l会带来更多的便利。
 
以上是一个简单的例子。
也可以写一个makefile文件来做这个,下面是一个makefile的例子:
 
############################################
## file        : test makefile for build current dir .cpp          ##  
## author      :                                                       ##  
## date-time   :                                                      ##  
############################################
CC      = gcc  
CPP     = g++  
RM      = rm -rf  
## debug flag  
DBG_ENABLE   = 1  
## source file path  
SRC_PATH   := .  
## target exec file name  
TARGET     := test  
## get all source files  
SRCS         += $(wildcard $(SRC_PATH)/*.cpp)  
## all .o based on all .c  
OBJS        := $(SRCS:.cpp=.o)  
## need libs, add at here  
LIBS := MyApi  
## used headers  file path  
INCLUDE_PATH := .  
## used include librarys file path  
LIBRARY_PATH := lib  
## debug for debug info, when use gdb to debug  
ifeq (1, ${DBG_ENABLE})   
CFLAGS += -D_DEBUG -O0 -g -DDEBUG=1  
endif  
## get all include path  
CFLAGS  += $(foreach dir, $(INCLUDE_PATH), -I$(dir))  
## get all library path  
LDFLAGS += $(foreach lib, $(LIBRARY_PATH), -L$(lib))  
## get all librarys  
LDFLAGS += $(foreach lib, $(LIBS), -l$(lib))  
## c++11 support  
CFLAGS += -std=c++11  
all: build  
build:  
$(CPP) -c $(CFLAGS) $(SRCS)  
$(CPP) $(CFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)  
$(RM) $(OBJS)  
clean:  
$(RM) $(OBJS) $(TARGET)
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24268.html