博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态库的编译执行
阅读量:5219 次
发布时间:2019-06-14

本文共 1648 字,大约阅读时间需要 5 分钟。

在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。

动态链接库的好处就是节省内存空间。
1、Linux下创建动态链接库
在使用GCC编译程序时,只需加上-shared选项即可,这样生成的执行程序即为动态链接库。
例如有文件:hello.c x.h main.c

[plain]
  1. 编译:gcc hello.c -fPIC -o libhello.so  

其中-fPIC选项的作用是:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,
所以动态载入时是通过代码拷贝的方式来满足不同的调用,而不能达到真正的代码段共享的目的.
将main.c与hello.so动态库

[plain]
  1. gcc main.c -L. -lhello -o main  

 

一、动态链接库

1.创建hello.so动态库

[cpp]
  1. #include <stdio.h>  
  2. void hello(){  
  3.     printf("hello world\n");  
  4. }  
  5. 编译:gcc -fPIC -shared hello.c -o libhello.so  

2.hello.h头文件

[cpp]
  1. void hello();  

3.链接动态库

[cpp]
  1. #include <stdio.h>  
  2. #include "hello.h"  
  3.   
  4. int main(){  
  5.     printf("call hello()");  
  6.     hello();  
  7. }  
  8. 编译:gcc main.c -L. -lhello -o main  

这里-L的选项是指定编译器在搜索动态库时搜索的路径,告诉编译器hello库的位置。"."意思是当前路径.

 

3.编译成够后执行./main,会提示:

[plain]
  1. In function `main':  
  2.    
  3. main.c:(.text+0x1d): undefined reference to `hello'  
  4. collect2: ld returned 1 exit status  

这是因为在链接hello动态库时,编译器没有找到。

解决方法:

[plain]
  1. sudo cp libhello.so /usr/lib/  

这样,再次执行就成功输入:

call hello()

 

二、静态库

文件有:main.c、hello.c、hello.h

1.编译静态库hello.o: 

[plain]
  1. gcc hello.c -o hello.o  #这里没有使用-shared  

2.把目标文档归档

[plain]
  1. ar -r libhello.a hello.o  #这里的ar相当于tar的作用,将多个目标打包。  

程序ar配合参数-r创建一个新库libhello.a,并将命令行中列出的文件打包入其中。这种方法,如果libhello.a已经存在,将会覆盖现在文件,否则将新创建。

3.链接静态库

[plain]
  1. gcc main.c -lhello -L. -static -o main  

这里的-static选项是告诉编译器,hello是静态库。

或者:

[plain]
  1. gcc main.c libhello.a -L. -o main  

这样就可以不用加-static

4.执行./main

输出:call hello()

 

三、借助自带的ldd实现程序来分析动态库搜索情况

ldd main

结果:

linux-gate.so.1 =>  (0x00efd000)
libhello.so => /usr/lib/libhello.so (0x00f6b000)
libc.so.6 => /lib/libc.so.6 (0x001a5000)
/lib/ld-linux.so.2 (0x00eb8000)
如果目标程序没有链接动态库,则打印“not a dynamic executable” 

转载于:https://www.cnblogs.com/zhangbing12304/p/7018883.html

你可能感兴趣的文章
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
查看>>
定制jackson的自定义序列化(null值的处理)
查看>>
auth模块
查看>>
javascript keycode大全
查看>>
前台freemark获取后台的值
查看>>
log4j.properties的作用
查看>>
游戏偶感
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
cocos2dx 3.3环境搭建
查看>>
c++ map
查看>>
exit和return的区别
查看>>
ThinkPHP5.1安装
查看>>
js += 含义(小知识)
查看>>
B2321 [BeiJing2011集训]星器 数学&&物理
查看>>
201571030319 四则运算
查看>>
RestTemplate 调用本地服务 connection refused
查看>>
.NET方向高级开发人员面试时应该事先考虑的问题
查看>>