场景:

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: 静态库和动态库的生成和使用的更多相关文章

  1. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  2. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

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

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

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

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

  5. Linux 静态库和动态库 使用说明

        Linux下程序运行中,有两种库,静态库和动态库.     静态库:名字一般为libxxx.a,编译时会整合到可执行程序中,优点是运行时不需要外部函数库支持,缺点是编译后程序较大,一旦静态库改 ...

  6. 在Linux中创建静态库和动态库

    我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...

  7. 详细讲解 关于Linux静态库和动态库的分析

    基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: ...

  8. linux下的共享库(动态库)和静态库

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  9. linux中C的静态库和动态库分析

    从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...

  10. Linux学习笔记7——linux中的静态库和动态库

    一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用a ...

随机推荐

  1. 未能从程序集“System.ServiceModel, Version=3.0.0.0”中加载类型“System.ServiceModel.Activation.HttpModule” 的解决办法

    未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“ ...

  2. 如何在windows的DOS窗口中正常显示中文(UTF-8字符)

    打开CMD.exe命令行窗口,通过 chcp命令改变代码页 UTF-8的代码页为65001,ANSI/OEM - 简体中文 GBK为936,window default OEM - 美国为437 如果 ...

  3. 阿里云ECS每天一件事D9:nginx1.7整合tomcat8.0

    仅通过8080端口访问jsp显然不是一算是一个太好的方法,可以使用nginx的proxy_pass子模块,实现nginx转发jsp请求至tomcat. 典型的配置如下: server { listen ...

  4. Java图形化界面设计——布局管理器之GridLayout(网格布局)

    网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式 ...

  5. 用户向导页面实现左右滑动的ViewPager

    然后在一个博客,以前的博客ImageSwitcher实现用户向导,现在,随着ViewPager实现同样的功能.直接看代码: 布局文件activity_main.xml <RelativeLayo ...

  6. Android内存泄漏分析及调试

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先 ...

  7. VS2015+MySql EF的配置问题

    自己做笔记,防止以后各种找! 去MySql下载最新版的安装包,MySql For Windows全部就可以了,根据开发需求安装功能,然后安装MySql的步骤上网去找一大堆. 注意事项: 第一:必须把V ...

  8. slots

    class Student(object): pass s = Student() s.name = 'Michael' print(s.name) def set_age(self, age): s ...

  9. Problem C Andy's First Dictionary(set的使用)

    题目链接:Problem C 题意:输入一个文本,找出所有不同的单词,按照字典序从小到大输出,单词不区分大小写. 思路:将字母序列都存为小写,非字母的字符变成空格,然后利用stringstream实现 ...

  10. C# 自定义控件的一些文章和博客

    http://blog.csdn.net/songkexin/archive/2009/12/08/4961215.aspx http://www.cnblogs.com/yuanfan/archiv ...