linux c: 静态库和动态库的生成和使用
场景:
main函数需要两个接口,一个求和函数,一个打印函数.
int sum(int i, int j); 求两个int数字的和.
void show(int i, char* name); 打印i的值和它的名称.
现在,需要制作:
一个静态库libcalc.a,提供sum的接口;
一个动态库libshow.so,提供show的接口.
#include <stdio.h>
#include "calc.h"
#include "show.h" int main(void)
{
int s;
int i = ;
int j = ;
s = sum(i,j);
show(i,"i");
show(j,"j");
show(s,"sum");
}
calc.c, calc.h
#include "calc.h"
int sum(int i, int j)
{
return(i+j);
}
~
#ifndef __CALC_H__
#define __CALC_H__
int sum(int i, int j);
#endif
show.c, show.h
#include "show.h"
void show(int i, char* name)
{
printf("%s=%d\n", name, i); }
~
#ifndef __SHOW_H__
#define __SHOW_H__
void show(int i, char* name);
#endif
~
Makefile:
CC = gcc all: main
main: libcalc.a main.c libshow.so
gcc -o main main.c -L. -lcalc -lshow
lib: libcalc.a libshow.so
libcalc.a : calc.o
ar crs libcalc.a calc.o
calc.o : calc.c
$(CC) -c calc.c -o calc.o
libshow.so: show.o
$(CC) -shared -o libshow.so show.o
show.o: show.c
$(CC) -fPIC -Wall -c show.c -o show.o
clean:
rm -rf *.o *.so *.a main
输入: make all --- 生成libcalc.a,libshow.so库和main可执行程序
make lib --- 生成libcalc.a,libshow.so库
make clean --- 清除目标文件
输入: export LD_LIBRARY_PATH=`pwd` --- 添加当前路径到动态库路径环境变量LD_LIBRARY_PATH
[root@localhost libshow]# export LD_LIBRARY_PATH=`pwd`
[root@localhost libshow]# echo $LD_LIBRARY_PATH
/work/jz2440/test/libshow\
输入: ./main 测试结果.
i=1
j=2
sum=3
=====================
关于动态库和静态库的相关知识:
1. linux编译动态库和静态库的makefile示例http://blog.csdn.net/shaoxiaohu1/article/details/46943417
2. 三种方法使得装载器正确寻找并加载到动态库:
a. 将libx.so移到系统库文件目录下
b. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
c. 使用配置文件告诉系统动态库的路径.
vi /etc/ld.so.conf.d/xxxx.conf
/work/jz2440/test/libshow
3. ldd xxxx查看依赖的动态库文件
[root@localhost libshow]# ldd main
linux-vdso.so.1 => (0x00007fff1edc0000)
libshow.so => /work/jz2440/test/libshow/libshow.so (0x00002ad8d3511000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a4fc00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a4f800000)
linux c: 静态库和动态库的生成和使用的更多相关文章
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
- [转]Linux下用gcc/g++生成静态库和动态库(Z)
Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10| 分类: linux | 标签:链接库 linux g++ gcc |举报|字号 订阅 ...
- Linux 静态库和动态库 使用说明
Linux下程序运行中,有两种库,静态库和动态库. 静态库:名字一般为libxxx.a,编译时会整合到可执行程序中,优点是运行时不需要外部函数库支持,缺点是编译后程序较大,一旦静态库改 ...
- 在Linux中创建静态库和动态库
我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...
- 详细讲解 关于Linux静态库和动态库的分析
基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: ...
- linux下的共享库(动态库)和静态库
1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...
- linux中C的静态库和动态库分析
从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...
- Linux学习笔记7——linux中的静态库和动态库
一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用a ...
随机推荐
- break在switch中的使用例子
/* Name:break在switch中的使用例子 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月21日 03:16:52 Description:以 ...
- Word2Vec在Tensorflow上的版本以及与Gensim之间的运行对比
接昨天的博客,这篇随笔将会对本人运行Word2Vec算法时在Gensim以及Tensorflow的不同版本下的运行结果对比.在运行中,参数的调节以及迭代的决定本人并没有很好的经验,所以希望在展出运行的 ...
- android studio 实现代码混淆
=======本文章属于转载==========原文章地址:http://my.oschina.net/aibenben/blog/370985 这篇文章等是跟大家分享一在Android studio ...
- MyEclipse13中修改Servlet.java源代码
Servlet.java源代码想要修改的步骤,与低版本的不同废话少说,直接来步骤: 1,在myEclipse的安装目录中搜索com.genuitec.eclipse.wizards文件,如图:选择co ...
- Java中static、this、super、final的用法
一. static 请先看下面这段程序: public class Hello{public static void main(String[] args){//(1)System. ...
- Javascript高级程序设计学习笔记一
看完w3school的javascript的概念,有点基础,开始红皮书的路程,今晚总结前二章的心得. 第一章:javascript简介 重点是javascript的实现是由 ECMAScript(核心 ...
- php入门微理解
1.php是什么?(来自百度百科) php:Hypertext preprocessor(超文本预处理器).一种开源脚本语言.主要用于web开发. 2.与其它语言的关系 介于HTML和C/C++,Ja ...
- zoj 1081 (改进的弧长算法)(转)
看到网上除了射线法,很长一段代码之外,看到了一个很简单的算法解决这个问题,特意转了过来 /* 这个算法是源自<计算机图形学基础教程>(孙家广,清华大学出版社),在该书 的48-49页,名字 ...
- Java中布尔类型操作符&=,|=与^=的使用
今天在对同事的代码进行code review的时候,见到一个比较好玩的写法.“flag &= false:”,乍一看,还感觉他写错了,但是程序可以正常运行,赶紧去百度,看一下这个写法到底是怎么 ...
- JS封装移动端触摸滑动插件应用于导航banner【精装版】
自己封装了一个小插件,一个小尝试. 可用于类似于京东导航等效果,效果多样化,很方便. 欢迎大家提点意见. mrChenSwiper( {parent, child, type, parentN, c ...