linux创建动态库

  

[1]新建源程序sharelib.c

 1 /*************************************************************************
 2     > File Name: sharelib.c
 3     > Author: copener
 4     > Mail: [email protected]
 5     > Created Time: 2015年05月14日 星期四 09时03分18秒
 6  ************************************************************************/
 7
 8 #include<stdio.h>
 9 /*
10 *插入法排序函数
11 *输入参数:*array是将要排序的数组,length是元素的长度
12 * */
13 void insert_sort(int *array, int length){
14     int i,j;
15     for(i=1; i<length; i++){
16         int temp;
17         j=i;
18         temp = array[j];
19
20         while(j>0){
21             if(temp < array[j-1]){
22                 array[j]=array[j-1];
23                 j--;
24             }else{
25                 break;
26             }
27
28             array[j] = temp;
29         }
30     }
31     return;
32 }
33
34 /*
35 *二分法查找函数
36 *输入参数:*array是将要查找的数组,item是要查找的元素,length是元素的长度
37 * */
38 int binary_search(int *array, int item, int length){
39     int high, low, mid;
40     high = length;
41     low  = 0;
42     mid  = (high + low)/2;
43
44     while(low < high){
45         printf("high:%d low:%d mid:%d\r\n",high,low,mid);
46         if(array[mid] > item){
47             if(low==(high-1) || high == mid ){
48                 return -1;
49             }
50             printf("array[%d]>%d\r\n",mid,item);
51             high = mid;
52             mid  = (high + low)/2;
53
54         }else if(array[mid]<item){
55             if(low==mid || high == (low+1)){
56                 return -1;
57             }
58             printf("array[%d]<%d\r\n",mid,item);
59             low = mid;
60             mid  = (high + low)/2;
61
62         }else{
63             return mid;
64         }
65     }
66     return -1;
67 }

[2]生成sharelib.so的动态库文件

1 [email protected]:~/workspace/test/sharelib$ gcc -shared -fPIC -o sharelib.so sharelib.c
2 [email protected]:~/workspace/test/sharelib$ ls
3 sharelib.c  sharelib.so 
1 //关于gcc 中的-shared 参数
2  -shared
3            Produce a shared object which can then be linked with other objects to form an executable.  Not all systems support this option.  For
4            predictable results, you must also specify the same set of options used for compilation (-fpic, -fPIC, or model suboptions) when you
5            specify this linker option.[1]
6
7
8 //-shared会与-fPIC参数一起使用来生成动态库文件

[3]添加sharelib.h的头文件引用

 1 /*************************************************************************
 2     > File Name: sharelib.h
 3     > Author: copener
 4     > Mail: [email protected]
 5     > Created Time: 2015年05月14日 星期四 11时23分18秒
 6  ************************************************************************/
 7
 8 extern void insert_sort(int *array, int length);
 9 extern int binary_search(int *array, int item, int length);
10 extern void bubble_sort(int * array, int length);

[4] 新建程序testapp.c调用动态库函数测试

 1 /*************************************************************************
 2     > File Name: testapp.c
 3     > Author: copener
 4     > Mail: [email protected]
 5     > Created Time: 2015年05月14日 星期四 11时25分46秒
 6  ************************************************************************/
 7
 8 #include<stdio.h>
 9 #include "sharelib.h"
10
11 int main(void){
12     int item;
13     int pos;
14     int i;
15     int array[5] ={5,9,2,3,1};
16
17     //排序
18     insert_sort(array, 5);
19     for(i=0; i<5; i++){
20         printf("%d ",array[i]);
21     }
22
23     //二分法查找
24     printf("\r\nplease input a number:\r\n");
25     scanf("%d", &item);
26
27     pos = binary_search(array, item, 5);
28     if(pos == -1){
29         printf("can‘t find or data not sort!\r\n");
30     }
31     else{
32         printf("done! the position is %d\r\n",(pos+1));
33     }
34
35     return 0;
36 }

[5]编译测试源码链接动态库sharelib.so,生成testapp可执行程序

1 [email protected]:~/workspace/test/sharelib$ gcc -o testapp testapp.c ./sharelib.so
2 [email protected]:~/workspace/test/sharelib$ ls
3 sharelib.c  sharelib.h  sharelib.so  testapp  testapp.c

[6]测试运行testapp

1 [email protected]:~/workspace/test/sharelib$ ./testapp
2 1 2 3 5 9
3 please input a number:
4 2
5 input end, processing...
6 high:5 low:0 mid:2
7 array[2]>2
8 high:2 low:0 mid:1
9 done! the position is 2

[7]小结:库写好后,只要提供sharelib.so库和sharelib.h函数头文件给使用者即可。链接库在编译程序时要放在被编译的源码文件之后,否则可能会链接失败。

时间: 2024-11-05 18:51:54

linux创建动态库的相关文章

linux 添加动态库路径

众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库,并且该 动 态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及 该动态库的其它资源了.在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定. 方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径. 可以通过编辑配置文件/

linux下动态库的编写和调用

linux下动态库的编写和调用 linux下编写和调用一个简单的动态库大概分为以下几个步骤: - 创建动态库程序文件 add.c int add(int a,int b) { return a+b; } 创建引用头文件 head.c #ifndef _HEAD_ #define _HEAD_ int add(int a,int b); #endif 生成目标文件 生成要加编译器选项 -fpic gcc -fpic -c add.c 然后生成动态库 注意使用链接器选项 -shared gcc -s

Linux下动态库和静态库的编译和链接

1.动态库:Linux中动态库的后缀名为.so 第二步:gcc -shared (C文件名.c) -o (lib动态库名.so) 创建一个.so文件,因为是64位的系统,不兼容,会报错 应该在指令前加-fpic 即gcc -fpic -shared (C文件名.c) -o (lib动态库名.so) 第三步:gcc () -(l库文件名无后缀) -L. -o (编译后的c文件名) -L.告诉系统文件库为当前目录 第四步:进入root模式,export LD_LIBRARY_PATH=.:$LD_L

Linux程序动态库加载优化

作者:zhanhailiang 日期:2014-10-26 linux程序动态库加载流程简介 linux从程序(program或对象)变成进程(process或进程),简单说来需要经过三步: fork进程,在内核创建进程相关内核项,加载进程可执行文件: 查找依赖的.so,逐一加载映射虚拟地址: 初始化程序变量: 如下例通过strace查看pwd命令执行过程: [root@~/wade/codeReview/learningc]# strace pwd execve("/bin/pwd"

Linux下动态库的使用

[简介] linux环境下的动态库一般名为libxxx.so, 用ldd命令分析某个可执行程序,可以看到该程序依赖哪些动态库,以及路径. 如 ldd ./test linux-vdso.so.1 =>  (0x00007fffaab52000) libc.so.6 => /lib64/libc.so.6 (0x0000003c4c800000) /lib64/ld-linux-x86-64.so.2 (0x0000003c4c000000) 如果有依赖库找不到,程序会无法正常运行. [创建一个

linux 生成动态库时提示relocation R_X86_64_32 against `.rodata&#39; can not be used when making a shared object;

linux生成动态库时遇到了relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC错误. 由于我的系统是AMD64位的,所以需要在编译的时候添加 -fPIC选项 解决方法: 例如: g++ -c -fPIC head.cpp    生成head.o g++ -fpic -shared -o libfun.so head.o linux 生成

谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH

谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH  PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23069658&id=4028681 学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续“上路”.回想起自己当年刚接触Linux时,不管是用源码包编译程序,还是程序运行时出现的和动态库的各种恩恩怨怨,心里那真叫一个难受.那时候脑袋里曾经

Linux生成动态库系统

Linux生成动态库系统 一个.说明 Linux下动态库文件的扩展名为 ".so"(Shared Object). 依照约定,全部动态库文件名称的形式是libname.so(可能在名字中增加版本). 这样.线程函数库被称作libthread.so. 静态库的文件名称形式是libname.a.共享archive的文件名称形式是libname.sa.共享archive仅仅是一种过渡形式,帮助人们从静态库转变到动态库. 小编综合自己学习体会以及网络上较好的内容.以简单的样例介绍动态库文件的生

Linux编程动态库知识

====动态库说明====1.库名称格式: lib + the_name_of_library + .so + version_number    exp:libc.so.62.ldconfig一般会创建soname,但不创建linker name(libname.so),后者一般安装库时创建3.暂时添加动态库目录LD_LIBRARY_PATH,一般用于测试和开发4.LD_PRELOAD预加载库.用于提前加载,紧急用途,或是特殊的测试情况5.创建动态库    gcc -fPIC -shared