【linux】 静态库编译

文件如下:

[email protected]:/home/test# ll
total 72
drwxr-xr-x 3 root root 4096 Sep  2 10:20 ./
drwxr-xr-x 4 root root 4096 Sep  2 08:31 ../
-rwxr-xr-x 1 root root 7901 Sep  2 10:09 a.out*
-rwxr-xr-x 1 root root 7901 Sep  2 10:16 exe*
drwxr-xr-x 2 root root 4096 Sep  2 10:14 lib/
-rwxrwxrwx 1 root root  149 Sep  2 10:00 libcaller.cpp*
-rw-r--r-- 1 root root   66 Sep  2 09:35 libcaller.h
-rw-r--r-- 1 root root 1184 Sep  2 10:14 libcaller.o
-rwxrwxrwx 1 root root  232 Sep  2 10:07 libfuncapi.cpp*
-rw-r--r-- 1 root root   64 Sep  2 10:05 libfuncapi.h
-rw-r--r-- 1 root root 1196 Sep  2 10:14 libfuncapi.o
-rw-r--r-- 1 root root   70 Sep  2 09:56 libsystemapi.h
-rwxrwxrwx 1 root root  116 Sep  2 08:44 libsystem.cpp*
-rw-r--r-- 1 root root 1156 Sep  2 10:14 libsystem.o
-rw-r--r-- 1 root root  590 Sep  2 10:14 makefile
-rwxrwxrwx 1 root root   82 Sep  2 09:37 test.cpp*
[email protected]:/home/test# 

文件内容分别如下:

[email protected]:/home/test# cat test.cpp
#include <iostream>

extern void caller();

int main()
{
        caller();
        return 0;
}

[email protected]:/home/test# cat libcaller.h
#ifndef LIB_CALLER_H
#define LIB_CALLER_H

void caller();

#endif
[email protected]:/home/test# cat libcaller.cpp
#include <stdio.h>
#include "libfuncapi.h"

void caller()
{
        printf("this is %s @ %s:%d.", __FUNCTION__,__FILE__,__LINE__);
        func_api();
        return;
}

[email protected]:/home/test# cat libfuncapi.h
#ifndef FUNC_API_H
#define FUNC_API_H

void func_api();

#endif
[email protected]:/home/test# cat libfuncapi.cpp
#include <stdio.h>
#include "libsystemapi.h"
#include "libfuncapi.h"

void func_api()
{
        printf("this is %s @ %s:%d.\n", __FUNCTION__,__FILE__,__LINE__);
        system_api();
        return;
}

#if 0
int main()
{
        funcapi();
        return 0;
}
#endif
[email protected]:/home/test# cat libsystemapi.h
#ifndef SYSTEM_API_H
#define SYSTEM_API_H

void system_api();

#endif
[email protected]:/home/test# cat libsystem.cpp
#include <stdio.h>

void system_api()
{
        printf("this is %s @ %s:%d.", __FUNCTION__,__FILE__,__LINE__);
        return;
}

[email protected]:/home/test# 

makefile:

[email protected]:/home/test#
[email protected]:/home/test# cat makefile 

CUR_DIR=$(PWD)

RM = rm -f

OBJS = $(CUR_DIR)/*.o
LIB_DIR = $(CUR_DIR)/lib

all: pre_work libsystemapi.a libfuncapi.a libcaller.a test

libsystemapi.a:
        g++ -c libsystem.cpp -o libsystem.o
        ar cr [email protected] libsystem.o

libfuncapi.a:libsystem.o
        g++ -c libfuncapi.cpp -o libfuncapi.o
        ar cr [email protected] libfuncapi.o $^

libcaller.a:libfuncapi.o libsystem.o
        g++ -c libcaller.cpp -o libcaller.o
        ar cr [email protected] libcaller.o $^

test: post_work $(LIB_DIR)/libcaller.a
        g++ test.cpp $(LIB_DIR)/libcaller.a -o exe

pre_work:
        mkdir -p $(LIB_DIR)

post_work:
        mv ./*.a $(LIB_DIR)/

clean:
        $(RM) $(OBJS) $(LIB_DIR)/*
[email protected]:/home/test# 
时间: 2024-10-27 19:27:44

【linux】 静态库编译的相关文章

linux静态库的生成与使用(转)

linux静态库的生成与使用(转) 库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib或/lib目录下. Linux库文件名由:前缀lib.库名和后缀3部分组成,其中动态链接库以.so最为后缀,静态链接库通常以.a作为后缀. 在程序中使用使用静态库和动态库时,他们载入的顺序是不同的. 静态库的代码在编译时就拷贝的应用程序中,这样的优点是节省编译时间

关于Linux静态库和动态库的分析

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

Linux静态库生成指南

Linux静态库生成指南 Linux上的静态库,其实是目标文件的归档文件.在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生成静态库. 配合静态库,写一个使用静态库中函数的头文件. 使用静态库时,在源码中包含对应的头文件,链接时记得链接自己的库. 下面通过实例具体讲解. 写源文件,生成目标文件. 第一个源文件 my_print.c #include <stdio.h> void cout(const char * mess

linux 静态库、共享库

一.什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不兼容的. Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.Linux系统有几个重要的目录存放相应的函数库,如/lib    /usr/lib. 二.静态函数库.动态函数库 A.  这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都被整合进目标代码中,他的优点就显而易见了,即编译后的执行

Linux 静态库&amp;动态库调用

1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不兼容的.本文仅限于介绍linux下的库.2.库的种类linux下的库有两种:静态库和共享库(动态库).二者的不同点在于代码被载入的时刻不同.静态库的代码在编译过程中已经被载入可执行程序,因此体积较大.共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小.3.库存在

[转]QT 4.8 静态库编译方法

最最初踏上QT之路是受到了XiaomaGee的指点,相比于常规的窗口程序开发,QT有着以下特点: 1. 优良的跨平台特性(支持Win.Linux.Mac 不同的平台下只需重新编译即可使用) 2. 面向对象 3. 丰富的API 4. 支持2D/3D图形渲染,支持OpenGL 5. 大量的开发文档(无需像VC一样装几个G的MSDN) 6. xml支持 其实,仅仅是第一点,就足以让我从VC转向QT.并且在本人的学习过程中发现,QT可以很轻易就打造出漂亮的界面,实在是让我爱不释手.不论是打造一些实用小程

SQLite3动态库、静态库编译

资源准备 1.下载SQLite3源码,下载地址为https://www.sqlite.org/download.html.下载sqlite-amalgamation-3200000.zip和sqlite-dll-win32-x86-3200000.zip,分别解压. 动态库编译 1.使用vs2012创建win32工程,名称为sqlite3,然后选择DLL和空项目 2.把shell.c.sqlite3.c.sqlite3.h.sqlite3ext.h.sqlite3.def拷贝到工程源文件目录,前

iOS之 PJSIP静态库编译(一)

首先放上pjsip官方网站http://www.pjsip.org/download.htm 下载的时候注意while the .bz2 has LF line-ends and is for Unix and Mac OS X systems.  ( 请下载.bz2 ) 下载完成后开始编译  : 首先你要有一个Xcode. 1.找到你的源码,也就是你下载下来的那个.tar.bz2  mac上应该自带解压工具我的就是双击就可以打开了 然后再建一个config_site.h  的.h文件  放在p

C++静态库编译

MFC 选项选择: 静态库编译 增加头文件:( opencv相关的) #pragma once #ifdef WIN32 #include <opencv2/core/version.hpp> //定义宏,保证在debug模式下,导入opencv_xxxd.lib,release模式下导入opencv_xxx.lib #ifdef _DEBUG # define CC_CVLIB(name) "opencv_" name CC_CVVERSION_ID "d.li

linux 静态库,makefile

mkdir testlib,组织文件目录如下 my_math.h int add(int a, int b); int subtract(int a, int b); my_math.c #include "../include/my_math.h" int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } my_print.h #include <stdio.h>