转自:http://www.cnblogs.com/leaven/archive/2010/06/11/1756294.html

http://hi.baidu.com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html

Linux下的动态库以.so为后缀,我也是初次在Linux下使用动态库,写一点入门步骤,以便以后能方便使用。

第一步:编写Linux程序库

文件1.动态库接口文件

//动态库接口文件getmaxlen.h

#ifndef _GETMAXLEN_H_

#define _GETMAXLEN_H_

int getMaxLen(int *sel,int N);

#endif

文件2.动态库程序实现文件

//动态库程序实现文件getmaxlen.c

#include "getmaxlen.h"

int getMaxLen(int *sel,int N)

{

   int n1=,n2=;

   for(int i=;i<N;i++)

   {

        if(sel[i]>sel[i-])

        {

             n2 ++;

             if(n2 > n1)

             {

                 n1 = n2;

             }

        }

        else

        {

             n2 = ;

        }

   }

   return n1;

}

第二步:编译生成动态库

     gcc getmaxlen.c –fPIC –shared –o libtest.so

由以上命令生成动态库libtest.so,为了不需要动态加载动态库,在命令时需以lib开头以.so为后缀。

–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

–shared:指明编译成动态库。

第三步:使用动态库

.      编译时使用动态库

文件1.动态库使用文件test.c

//使用动态库libtest.so,该文件名为test.c

#include "getmaxlen.h"

int main()

{

   int Sel[] = {,,,,,,,,,,,,,,};

   int m;

   m = getMaxLen(Sel,);

   printf("%d",m);

   return ;

}

编译命令:

gcc test.c –L . –l test –o test

     –L:指明动态库所在的目录

      -l:指明动态库的名称,该名称是处在头lib和后缀.so中的名称,如上动态库libtest.so的l参数为-l test。

     测试:

     ldd test

        ldd 测试可执行文件所使用的动态库

.      动态加载方式使用动态库

文件内容:

//动态库的动态加载使用

int main()

{

      void *handle = NULL;

      int (*getMaxLen)(int *sel,int N);

      int sel[] = {,,,,,,,,,,,,,};

      handle = dlopen("./libtest.so",RTLD_LAZY);

      if(handle == NULL)

      {

          printf("dll loading error.\n");

          return ;

      }

      getMaxLen = (int(*)(int *,int))dlsym(handle,"getMaxLen");

      if(dlerror()!=NULL)

      {

          printf("fun load error.\n");

          return ;

      }

      printf("%d\n",getMaxLen(sel,));

}

编译命令:

gcc –ldl test1.c –o test

gcc -o test test.c ./libmytools.so

Linux动态库的编译与使用 转载【转】的更多相关文章

  1. Linux动态库的编译与使用 转载

    http://hi.baidu.com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html Linux下的动态库以.so为后缀,我也是初次在Linux下 ...

  2. Linux动态库的编译与使用

    转载: http://hi.baidu.com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html Linux下的动态库以.so为后缀,我也是初次在Li ...

  3. Linux 动态库的编译和使用

    1. 动态链接库简介 动态库又叫动态链接库,是程序运行的时候加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态库是目标文件的集合,目标文件在动态库中的组织方式是按特殊的方式组 ...

  4. linux动态库编译和使用

    linux动态库编译和使用详细剖析 引言 重点讲述linux上使用gcc编译动态库的一些操作.并且对其深入的案例分析.最后介绍一下动态库插件技术, 让代码向后兼容.关于linux上使用gcc基础编译, ...

  5. Linux上静态库和动态库的编译和使用

    linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...

  6. linux动态库编译和使用详细剖析 - 后续

    引言 - 也许是修行 很久以前写过关于动态库科普文章, 废话反正是说了好多. 核心就是在 linux 上面玩了一下 dlopen : ) linux动态库编译和使用详细剖析 - https://www ...

  7. linux动态库默认搜索路径设置的三种方法

    众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib .动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两 ...

  8. linux动态库加载RPATH, RUNPATH

    摘自http://gotowqj.iteye.com/blog/1926771 linux动态库加载RPATH, RUNPATH 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共 ...

  9. Android NDK开发及调用标准linux动态库.so文件

    源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...

随机推荐

  1. UVA - 1328 Period(循环节kmp)

    https://vjudge.net/problem/UVA-1328 题意 求每个前缀的最小循环节,要求至少循环两次且为完整的. 分析 求next数组,i-next[i]即为前缀i的最小循环节,再判 ...

  2. Hive基本命令解析

    1. Hive的分区作用 命令:创建分区 create table t_sz_part(id int, name string) partitioned by (country string) row ...

  3. Storm安装部署

    1.从官网下载安装包,并通过Xftp5上传到机器集群上 下载apache-storm-1.2.1.tar.gz 版本,并通过Xftp5上传到hadoop机器集群的第一个节点node1上的/opt/up ...

  4. python--numpy、pandas

    numpy 与 pandas 都是用来对数据进行处理的模块, 前者以array 为主体,后者以 DataFrame 为主体(让我想起了Spark的DataFrame 或RDD) 有说 pandas 是 ...

  5. overlay网络隔离实验失败记录

    按照 https://www.cnblogs.com/CloudMan6/p/7341487.html进行操作,实验结果与老师文章中的正好相反,不同 overlay 网络中的主机可以通信,验证部分见下 ...

  6. tedu训练营day04

    1.猜拳:import randomlist = ['石头','剪刀','布']y = input('''(0) 石头(1) 剪刀(2) 布请出拳(0/1/2):******************* ...

  7. js动态修改Easyui元素不生效,EasyUI动态渲染解析解决方案

    easyui的渲染是在在网页加载完成后,相当于在$(document).ready()事件中,对整个网页进行了一次扫描,发现某个input标签含有easyui的属性,就在相应的地方进行ui的修改.因此 ...

  8. Win10 64位连接LJM1005打印机局域网访问

    除了网上常见的开Guest用户之类需要额外三个设置 (1)安装LJM1005驱动LJM1005_Full_Solution (2)设置打印机共享和安全中的everyone全部勾选(解决能看到打印机无法 ...

  9. 普通用户从其他主机连接MySQL数据库

    一.登陆数据库 mysql -u root -p [超级用户密码]; 二.创建新用户 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 参 ...

  10. bash test命令探秘

    shell 测试条件命令 http://blog.csdn.net/yangruibao/article/details/7427503 test 和 [ 命令 虽然 Linux 和 UNIX 的每个 ...