关闭

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

标签: 编译makefile
908人阅读 评论(0) 收藏 举报
分类:

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文件:


3. 之后再将.o文件打包成lib,在类Unix系统中,静态库是.a文件:


4. 之后就是使用这个lib库了,下面是使用该库的源代码:

#include "basic.h"

int main()
{
	cout << getRandom(20) << endl;

}

5. 源代码中只需要包含头文件就可以了,重点在于编译的时候,下面是编译命令:


这里需要注意两点:

1) -L参数指定包含lib的目录;-l指定lib名;

2)lib名也需要注意,名称是libMyAPI.a,但是使用时不需要加lib和.a后缀。

当然也可以不使用-L -l等选项,直接使用lib全称:


之后生成的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)



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:105463次
    • 积分:2065
    • 等级:
    • 排名:第18610名
    • 原创:118篇
    • 转载:2篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论