编译基础——如何用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(...
  • mzbonnt
  • mzbonnt
  • 2016年04月21日 18:03
  • 4452

Linux下开发环境(gcc/g++/makefile/gdb)

先决条件 gcc 这是c语言的编译器 从前,我写了一个Linux多线程到程序Main.c,使用gcc -g Main.c -lpthread -o Main编译,就出现来未安装gcc的提示,我按照提...

gcc/g++ 以及makefile

fpic:产生位置无关码 解释一下,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用...

教会你如何编写makefile文件

最近一直在学习makefile是如何编写的。     当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷。linux有一个自带的make命...
  • wallwind
  • wallwind
  • 2011年09月19日 20:47
  • 29882

g++如何编译多个原文件和头文件

我在windows下用Visual studio调试过,可以通过,可以在linux下用g++时候就出现问题了,源文件和头文件如下,怎么才能编译通过呢? (头文件名是:Sales_item.hpp 源...
  • wfdtxz
  • wfdtxz
  • 2012年03月22日 22:15
  • 21552

linux下实现g++编译链接c++源文件和头文件

C++编译多个文件 makefile (2012-07-07 21:18:05) 转载▼     逐步编译: g++ -c APCluster.cp...

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

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

makefile编译静态库和动态库

一。静态库 创建静态库   仍使用刚才的hello.c和test.c。   第一步,生成目标文件。   gcc -c hello.c   第二步,把目标文件归档。   ar r libhe...

gcc编译时对'xxxx'未定义的引用问题

这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。 在gcc编译的时候,如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。 例如:在main.c中使用了temp,那么编译的时候必...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译基础——如何用g++编译自己的库,以及一个简单的makefile文件
举报原因:
原因补充:

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