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 ...
随机推荐
- 未能从程序集“System.ServiceModel, Version=3.0.0.0”中加载类型“System.ServiceModel.Activation.HttpModule” 的解决办法
未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“ ...
- 如何在windows的DOS窗口中正常显示中文(UTF-8字符)
打开CMD.exe命令行窗口,通过 chcp命令改变代码页 UTF-8的代码页为65001,ANSI/OEM - 简体中文 GBK为936,window default OEM - 美国为437 如果 ...
- 阿里云ECS每天一件事D9:nginx1.7整合tomcat8.0
仅通过8080端口访问jsp显然不是一算是一个太好的方法,可以使用nginx的proxy_pass子模块,实现nginx转发jsp请求至tomcat. 典型的配置如下: server { listen ...
- Java图形化界面设计——布局管理器之GridLayout(网格布局)
网格布局特点: l 使容器中的各组件呈M行×N列的网格状分布. l 网格每列宽度相同,等于容器的宽度除以网格的列数. l 网格每行高度相同,等于容器的高度除以网格的行数. l 各组件的排列方式 ...
- 用户向导页面实现左右滑动的ViewPager
然后在一个博客,以前的博客ImageSwitcher实现用户向导,现在,随着ViewPager实现同样的功能.直接看代码: 布局文件activity_main.xml <RelativeLayo ...
- Android内存泄漏分析及调试
尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先 ...
- VS2015+MySql EF的配置问题
自己做笔记,防止以后各种找! 去MySql下载最新版的安装包,MySql For Windows全部就可以了,根据开发需求安装功能,然后安装MySql的步骤上网去找一大堆. 注意事项: 第一:必须把V ...
- slots
class Student(object): pass s = Student() s.name = 'Michael' print(s.name) def set_age(self, age): s ...
- Problem C Andy's First Dictionary(set的使用)
题目链接:Problem C 题意:输入一个文本,找出所有不同的单词,按照字典序从小到大输出,单词不区分大小写. 思路:将字母序列都存为小写,非字母的字符变成空格,然后利用stringstream实现 ...
- C# 自定义控件的一些文章和博客
http://blog.csdn.net/songkexin/archive/2009/12/08/4961215.aspx http://www.cnblogs.com/yuanfan/archiv ...