Linux 创建静态库以及静态库的使用

目录:

1 手动建立静态库

2 静态库的使用

3 通过makefile文件建立静态库


1 手动建立静态库

将建立一个简单的静态库

-1: 将所需的源文件编译成目标文件

------ helpguy.h

#ifndef __helpguy_h__
#define __helpguy_h__

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

void err_msg(const char* errMsg, ...);

#endif // __helpguy_h__

------ helpguy.cc

#include "helpguy.h"

#include <stdarg.h>

#include <errno.h>
#include <string.h>

void exit_msg(const char* errMsg, ...)
{
     va_list ap;

     va_start(ap, errMsg);

     int errno_save = errno;
     char buf[1024];
     vsnprintf(buf, sizeof(buf) - 1, errMsg, ap);

     if(errno_save != 0)
     {
          int len = strlen(buf);
          snprintf(buf + len, sizeof(buf) - len - 1, ": (%d) %s",
                    errno_save, strerror(errno_save));
     }

     strcat(buf, "\n");

     // output
     fflush(stdout);
     fputs(buf, stderr);
     fflush(stderr);

     va_end(ap);

     exit(1);
}

编译:

g++ -c helpguy.cc  // 生成文件: helpguy.o

-2 将目标文件创建成静态库文件

一般静态库名称为libxxx.a,在使用时,在命令行末尾添加 -lxxx, 那么,编译就会查找

libxxx.a或者libxxx.so文件。

ar crs libhelpguy.a helpguy.o // 生成库文件:libhelpguy.a


2 静态库的使用

------ 测试文件 main.cc

#include "helpguy.h"

#include <iostream>

int main(int argc, char** argv)
{
     std::cout << "Please enter positive integer: ";

     int value;
     std::cin >> value;

     if(value <= 0)
          exit_msg("need positive integer");

     std::cout << "The value is: " << value << std::endl;
     std::cout << "OK" << std::endl;

     return 0;
}

编译:

g++ -o main main.cc -L. -lhelpguy // 生成: main文件

./main

当你输入非整数的时候就会调用exit_msg

-L. 告诉编译器在当前目录洗"."寻找名为 libhelpguy.a或者libhelpguy.so库文件


3 通过makefile文件建立静态库

----- makefile

CFLAGS=-g -D__STDC_FORMAT_MACROS -Wall -Werror -I.

LIBS=-lrt -pthread

libhelpguy.a: helpguy.o

ar crs [email protected] $^

chmod u+x [email protected]

helpguy.o: helpguy.cc

g++ -o [email protected] -c $< $(CFLAGS)

clean:

rm -rf helpguy.o

输入make命令即可创建静态库文件:

make

g++ -o helpguy.o -c helpguy.cc -g -D__STDC_FORMAT_MACROS -Wall -Werror -I.

ar crs libhelpguy.a helpguy.o

chmod u+x libhelpguy.a

如果你有多个.o文件,可以在libhelpguy.a: 后边继续添加,然后模仿 helpguy.o添加

生成目标文件的命令。

时间: 2024-10-07 18:45:09

Linux 创建静态库以及静态库的使用的相关文章

linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考<Linux程序设计> 1. 静态库也被称为归档文件(archive,因此创建命令是ar),编译器和链接器负责将程序代码和静态库结合在一起组成单独的可执行文件: 但是缺点是许多应用程序同时运行并使用来自同一个静态库的函数时,内存中就会有一个函数的多份副本,而且程序文件自身也有多份同样的副本,这将消

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格

Linux使用静态库和动态库

Linux使用静态库和动态库 (一)库的概念 库是可以复用的代码,在一些大的项目中常常会用到库. 本质上说:库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 一般说库是说两种: 静态库:linux下.a文件.windows下.lib文件 动态库:linux下.so文件.windows下.dll文件 最近花了一些时间把linux下编译.链接等研究了一下,作为一个菜鸟记录并分享一蛤. (二)静态库与动态库 程序的编译运行要经过以下步骤: 1.源文件(.h .cpp等) 2.预编译 3.编

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

【转】Linux下gcc生成和使用静态库和动态库详解

一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者的库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2 库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可

Linux系统中“动态库”和“静态库”那点事儿【转】

转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制

linux成长之路(gcc编译器、静态库、动态库)

Jeremy Lin GCC简介 GCC(GNU Complier Collection)是GNU推出的功能强大.性能优越的多平台编译器套件,它包括了C.C++.Objective-C.Fortran.Java.Ada和Go语言的前端,也包括了这些语言的库,当前最新的版本是GCC 5.1.GCC可以在多种硬件平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%-30%.GCC编译器能将C.C++语言源程序.汇程式程序和目标程序编译.连接成可执行文件,如果没有给出可执行文件的名字

Linux系统中“动态库”和“静态库”那点事儿

摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接

[转]Linux下用gcc/g++生成静态库和动态库(Z)

Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅 在 linux 下,库文件一般放在 /usr/lib 和 /lib 下, 静态库的名字一般为 libxxxx.a ,其中 xxxx 是该 lib 的名称 动态库的名字一般为 libxxxx.so.major.minor , xxxx 是该 lib 的名称, major 是主版本号, minor 是副版本号