Linux下 静态链接库 和 动态链接库
先来说说C/C++编译过程
- 编译: 检查语句符号定义,将C/C++代码翻译生成中间语言。
- 链接: 将中间代码整合,生成可执行的二进制代码。
简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特殊格式的归档文件(打包的文件)。
使用静态库:
1. 先编写库函数
#ifndef _PRINT_TEST_H_ #define _PRINT_TEST_H_
#ifdef __cplusplus
extern "C"
{
#endif extern int test_a;
extern void print_test();
extern void print_data_a(); #ifdef __cplusplus
}
#endif #endif
print_test.h
#ifdef __cplusplus
extern "C"
{
#endif #include <stdio.h> void print_test()
{
printf("print_test\n");
} int test_a = ;
void print_data_a()
{
printf("data in libtest test_a = %d\n", test_a++);
} #ifdef __cplusplus
}
#endif
print_test.c
2. 主函数文件
#include "print_test.h" int main()
{
print_test();
print_data_a();
print_data_a();
print_data_a();
print_data_a();
print_data_a();
return ;
}
main.c
3. 编译库函数

4. 打包库

5. 编译主函数和运行

tips: 静态库文件命名通常以lib开头,链接库时直接 -l库名。
静态库的优点在于一次编译生成目标(main)后,这个目标是一个独立的二进制文件,而不用考虑其运行环境。
使用动态库
1. 编译库

ps: 很奇怪一点是,dltest.so被赋予了可执行权限。
2. 编译主函数

tips: 最好将自己要用的动态链接放到系统默认的库目录下,否则运行目录没有相应的库文件会报错。
动态库优点在于,生成的目标更小;当库文件更新时,只要原来用到的符号地址不变,目标可以继续运行,并且伴随着库一起更新。这样动态库的更新可以与目标的更新相互独立进行。
Linux下 静态链接库 和 动态链接库的更多相关文章
- linux下静态链接库和动态链接库
关于链接库的知识,网上太多资料了,但是并不代表我很熟悉.今天遇到了 一个问题,就是由于静态链接库和ubuntu系统不兼容导致的,虽然花了点时间才搞定 但是,其中暴露的问题也不少. 没有区分好静态链接库 ...
- linux c静态链接库与动态链接库
库函数是我们编程的时候经常用到的,我们协作编程的时候可以将常用的函数封装成库供大家使用,这样能够提高大家的工作效率.对于库函数,它分为动态链接库和静态链接库.对于静态链接库我们必须是连接到可执行文件中 ...
- linux下静态链接库的用法
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于unde ...
- Linux环境下c语言静态链接库和动态链接库创建和使用
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...
- linux静态链接库与动态链接库详解
一顺便说说了哦 通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(e ...
- vc下的静态链接库与动态链接库(一)
一.静态库与动态库的区别 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Lib ...
- Makefile常用万能模板(包括静态链接库、动态链接库、可执行文件)
本文把makefile 分成了三份:生成可执行文件的makefile,生成静态链接库的makefile,生成动态链接库的makefile. 这些makefile都很简单,一般都是一看就会用,用法也很容 ...
- [拾零]C/C++_代码复用的实现_静态链接库_动态链接库_使用.def导出
1 静态链接库 1.1 创建静态链接库: 1.在VC6中创建项目:Win32 Static Library 2.在项目中创建两个文件:xxx.h 和 xxx.cpp 3.编译 1.2 使用静态链接库 ...
- 介绍静态链接库和动态链接库的差别,及在VC++6.0中的建立和使用
首先介绍一下链接库:链接库分为动态链接库和静态链接库两种 LIB是静态链接库,在程序编译连接的时候是静态链接,其相应的文件格式是.lib. 即当程序採用静态链接库的时候..lib文件里的函数被链接到终 ...
随机推荐
- java学习之部分笔记
1.枚举类型 2.String的方法Index的用法.StringBuffer 的用法.Math的用法.Date类 3.用abstract修饰的类就是抽象类.抽象方法不能有主体.抽象类中,可以有抽象方 ...
- C#.NET面向对象(语法点)
一.继承 C#中继承的规则 1:继承是可传递的 A:B B:C 2:派生类应当是对基类的扩展.派生类可以添加新的成员,但不能除去已经继承的成员的定义. 3:构造函数和析构函数不能被继承 4:如果派 ...
- Oracle如何只显示重复数据,或不显示重复数据
思路: 一.对所有字段进行分组并计数 二.计数大于1的就显示 select * from 表名 group by 字段1,字段2 having count(*)>1 (显示重复)
- IT技术论坛
http://www.v2ex.com/ http://www.dewen.org/ http://stackoverflow.com/ http://segmentfault.com/ 博客园
- python 基础篇(一)--linux命令篇
期末下一门考试还有些时间,那就来看看python的视频吧,基于python2.7.6,用的是xubuntu(vm搭建虚拟机). 先花了2,3个小时安装了xubuntu,配置了搜狗输入法,gedit也配 ...
- linux学习笔记之文件结构和函数
本文参考<UNIX环境高级编程> 一.基础介绍. 1:文件的构成. 1,首先声明,这里的文件和目录,表示普通的文件和目录.不确定是否可以应用到:设备,管道等特殊形式的文件(UNIX把它们也 ...
- Bluestacks视窗界面调整及内存调整经验
本文将分享bluestacks视窗界面调整及内存调整的经验,可以有效解决Bluestacks缓慢.卡的问题! 一.bluestacks视窗界面调整 1.进入注册表: 2.找到下图中的键值: 3.修改键 ...
- NPOI导出多张图片到Excel
常用NPOI导出数据到excel,但没有试过如何导出图片.NPOI最大的特点就是不依赖于Excel组件,服务端不需要安装Excel.在单元格中插入图片主要是用HSSFClientAnchor对象.他有 ...
- VS2003转VS2010 fatal error C1189: #error
我自己的mfc的demo要转换编译环境出现以下编译错误: VS2010编译错误:fatal error C1189: #error : This file requires _WIN32_WINNT ...
- mysql 1054错误
往数据库插入数据的时候报错,插入数据的是这样的 [SQL] insert into stock(code,name,b_price,s_price,num,rate,profit) values (1 ...