zoukankan      html  css  js  c++  java
  • 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 = 1;
        int j = 2;
        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
    ", 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)   

  • 相关阅读:
    页面加载完毕相关信息淡入效果
    导航菜单底部滑动条跟随效果
    我要成为优秀的前端一员!
    (转)git合并多个commit
    Windows 7 + PHP 5.3 + WAMP 下 Imagick 扩展安装
    使用 PHP 框架 Yii 访问 MS SQL 的尝试
    拼合逐月数据系列
    编程视频教程推荐
    Java 实现 Domino邮箱自动注册
    二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)
  • 原文地址:https://www.cnblogs.com/mylinux/p/5866781.html
Copyright © 2011-2022 走看看