Linux下动态库和静态库的生成和使用
1.准备头文件和源文件
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name):
#endif
hello.c
#include <stdio.h> void hello(const char *name)
{
printf("Hello, %s!\n", name);
}
main.c
#include "hello.h" int main(int argc, char * argv[])
{
hello("C Programmer");
return ;
}
2.了解动态库和静态库的区别
①静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
②动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
3.静态库的生成步骤
①编译hello.c生成目标文件,注意此时要加入参数-fPIC;
gcc -c -fPIC hello.c
执行此命令后会生成hello.o的目标文件。
②根据上面的hello.o文件生成动态库文件;
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so。用gcc来创建动态库。
gcc -shared -fPIC -o libmyhello.so hello.o
执行此命令后会生成libmyhello.so的动态库文件。
③使用动态库;
gcc -o hello main.c -L. -lmyhello // 和静态库一样
此时运行hello会报错,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态 库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so复制到目录/usr/lib中,再试试。结果成功了!这也进一步说明了动态库在程序运行时是需要的。
4.动态库的生成步骤
①编译hello.c生成目标文件;
gcc -c hello.c
执行此命令后会生成hello.o的目标文件。
②根据上面的hello.o文件生成静态库文件;
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。
ar cr libmyhello.a hello.o
执行此命令后会生成libmyhello.a的静态库文件。
③使用静态库;
gcc -o hello main.c -L. -lmyhello
上面如果不指定静态库的话,由于main.c中引入了hello.h,编译则会报错。
执行上面的命令,生成的hello可执行文件便可以运行了,libmyhello.a文件删除后也不会影响hello的运行。
5.PS
当静态库和动态库同名时, gcc命令将优先使用动态库。
Linux下动态库和静态库的生成和使用的更多相关文章
- linux下动态连接变为静态打包,使用statifier_S展翅飞_新浪博客
		
linux下动态连接变为静态打包,使用statifier_S展翅飞_新浪博客 linux下动态连接变为静态打包,使用statifier (2013-04-27 14:38:19) 转载▼
 - Linux下编译、使用静态库和动态库   自己测过的
		
每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...
 - Linux下制作和使用静态库和动态库
		
概述 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib. 静态函数库: 这类库的名字一般是libxxx. ...
 - linux下 GCC编译链接静态库&动态库
		
静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...
 - Linux下将多个静态库(.a)合并成一个静态库文件(.a)的命令操作,方法一
		
.a 文件的结构和.tar文件就没有什么区别. x 命令解出来, a 命令添加, t命令列表 假设A.a, B.a C.a 在/usr/local/lib目录下 mkdir /tmp/libABC c ...
 - 动态库与静态库的学习  博主写的很好   静态库 编译的时候 需要加上 static   动态库编译ok运行不成功就按照文章中的方法修改
		
来源连接 http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...
 - 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
		
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
 - Linux编译多个不同目录下的文件以及静态库、动态库的使用
		
先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 ht ...
 - Linux下动态库查找路径的问题
		
说到和动态库查找路径相关的问题,总体上可以分为两类: 第一类: 通过源代码编译程序时出现的找不到某个依赖包的问题,而如果此时你恰好已经按照它的要求确确实实.千真万确.天地良心地把依赖库给装好了, ...
 
随机推荐
- bind系统调用
			
/* * Bind a name to a socket. Nothing much to do here since it's * the protocol's responsibility to ...
 - jmeter,测登录,要不要过滤掉JS,CSS等请求?感觉过滤掉了压出来的数据就不真实?
			
首先,我们来明确下你的性能测试目的,你的目的是服务端的性能还是前端的性能.这两用目的所涉及到的测试场景和工具等方法是不一样的.1.我们先来谈谈服务端的性能.一般的web产品,像css, jpeg等这种 ...
 - Mysql中truncate table和delete语句的区别
			
Mysql中的truncate table和delete语句都可以删除表里面所有数据,但是在一些情况下有些不同! 例子: truncate table gag; (1)truncate table删除 ...
 - Golang实现mysql读库映射成Map【Easy】
			
这个类库灵感来源于.net的dbHelper类,因为其简单易用,现在go的driver必须使用对象映射,这让人火大不爽,不能实现灵活的Map,在Key经常变动的业务场景里面非常不爽,我还是喜欢直接写s ...
 - Python爬取微信好友
			
前言 今天看到一篇好玩的文章,可以实现微信的内容爬取和聊天机器人的制作,所以尝试着实现一遍,本文记录了实现过程和一些探索的内容 来源: 痴海 链接: https://mp.weixin.qq.com/ ...
 - jdbc一次性采集mysql和oracle的海量数据,5000W+为例
			
最近做的采集工具遇到采集一天数据(超过5000W行数据)的情况, 采集mysql的时候直接采用流式读取的方式可以一次全部都读取出来,速度的话取决于网络速度 stmt = conn.createStat ...
 - Runtime.getRuntime().exec 类  防止阻塞
			
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; impor ...
 - MyBatis3-实现MyBatis分页
			
此文章中的例子是沿用上一篇文章http://www.cnblogs.com/EasonJim/p/7055499.html的Spring MVC集成的例子改装的. MyBatis分页有以下方式实现: ...
 - java 学习网站
			
http://how2j.cn/ 教学网站 慕课视频下载网站 http://www.feemic.cn/mooc //慕课搜索和下载的网站http://www.soshoulu.com/tools/ ...
 - [经典算法题]寻找数组中第K大的数的方法总结
			
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...