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

原创 2016年06月01日 21:21:02

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)



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

g++多文件编译和简单MakeFile文件写法

上文(g++基本用法 )介绍简单的g++编译器的用法,只是针对没有依赖关系的单个文件的操作,当我们有多个文件需要编译的时候,是如何工作的呢?下面以简单的实例进行介绍,然后把实例以MakeFile文件实...

makefile编译C++程序 gcc/g++区别

一个简单的C++程序和makefile文件,在执行make时候报错,下面是详细信息: 下面是hello.cpp文件内容 #include using namespace std; int main(...

linux编译动态库和静态库的makefile示例

根据GenDll.cpp文件,分别生成动态库.so和静态库.a文件,需要依赖的外部库为opencv。1. 静态库的生成makefile命令的简介可参考:跟我一起写 Makefile。使用ar命令生成....

Makefile简单例子

目的:                基本掌握了 make 的用法,能在Linux系统上编程。     ...

Linux下Makefile中动态链接库和静态链接库的生成与调用

背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译、链接、生成可执行文件,从而实现了移植的过程。平台是Toradex的...

本站上传有假软件

今天我下载了《图标更换器(ExeIco) V2.3 注册版.rar》,转换按完成时没想到一点击就关机,连试几次都这样,这是无效软件郁闷。。。!
  • OAMDN
  • OAMDN
  • 2011-03-19 04:07
  • 108

BMC简介

BMC简介。

PCI/PCIe基础

PCI/PCIe基础

《深入理解LINUX内核》学习笔记——内存管理

《深入理解LINUX内核》学习笔记——内存管理

初来乍到,请多关照

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)