linux C/C++编程之库-动态库,静态库创建及使用

简介: 生成和使用链接库:静态库是对象文件obj的集合,静态库扩展名称.a 静态库由ar -rcs生成静态库优点:1,不用重新编译程序库代码,进行重新的重新链接,节省了编译过程时间2,开发者可以提供库文件给使用的人员,不用开放源码 3,生成静态链接库,或者将一个obj文件加到已经存在的静态库ar 库文件名称.

生成和使用链接库:
静态库是对象文件obj的集合,静态库扩展名称.a 静态库由ar -rcs生成

静态库优点:
1,不用重新编译程序库代码,进行重新的重新链接,节省了编译过程时间
2,开发者可以提供库文件给使用的人员,不用开放源码

3,生成静态链接库,或者将一个obj文件加到已经存在的静态库
ar 库文件名称.a obj文件1 obj文件2 obj文件N+
创建静态库的最基本步骤是生成目标文件;

动态链接库

-soname,libstr.so 表示生成
动态库别名libstr.so
库名是str
库前缀是lib,后缀名称是so
-o libstr.so.1选项表示生成名字的实际动态链接库文件
-shared告诉编译器生成一个动态链接库

基于C源文件生成动态链接库的完整命令

gcc -shared -Wl,-soname,libstr.so -o libstr.so.1 C源文件需生成动态库的;

生成动态链接库很重要的问题是安装
一般情况讲生成的动态链接库复制到系统默认的动态链接库的搜索路径,通常/lib,/usr/lib,/usr/local/lib 请注意与我们的标准头文件

/etc/ld.so.cache

静态链接库,动态链接库,动态加载库
动态加载库与动态链接库不同 的是:动态链接库在程序启动的时候就要寻找动态库,找到库函数,而动态加载库可以用程序的方法来控制什么时候加载,动态加载库主要有函数dlopen(),dlerror(),dlsym()和dlclose()来控制动态库的使用;
dynamicLinker open error,close
函数dlopen()按照用户指定的方式打开动态链接库,其中参数filename为动态链接库的文件名,flag为打开方式,一般为RTLD_LASY,函数的返回值为库的指针
Funcation Prototype
void * dlopen(const char *filename,int flag);
void *phhandle = dlopen("./libStrLen.so",RTLD_LAZY);

打开动态库函数dlopen(const char *filename,int flag);

获得函数指针dlsym()
使用动态链接库的目的是调用其中的函数,完成特定的功能,函数dlsym()可以获得动态链接库中指定的函数的指针,然后可以使用这个函数指针进行操作,函数dlsym()的原型如下,其中参数handle为dlopen()打开动态库后返回的句柄,参数symbol为函数的名称,返回值为函数的指针;

/tmp/ccDDcePd.o: In function `main':
dl.c:(.text+0x48): undefined reference to `dlopen'
dl.c:(.text+0x64): undefined reference to `dlerror'
dl.c:(.text+0x9e): undefined reference to `dlsym'
dl.c:(.text+0xa7): undefined reference to `dlerror'
dl.c:(.text+0xd9): undefined reference to `pStrLenFunc'
collect2: error: ld returned 1 exit status

总结-关于C下使用静态链接库,动态库链接库,动态加载库

1,静态链接库

优点:

隐藏源码,提高最终可执行程序的编译速度

2,动态链接库

动态链接库在出现启动的时候加载库,读取库中函数...

3,动态加载库

优点,使用程序的方法控制库在何时加载

【动态加载库头文件dynamic link fcn--dlfcn.h】

动态加载库
首先使用函数dlopen()打开动态链接库,判断是否正常打开,可以使用函数dlerror()判断错误,如果上面的过程正常,使用函数dlsym()获取动态链接库的某个函数,使用这个函数完成特定功能
GCC选项
头文件Path,加载库Path,警告信息
-dmacro[defined macro]定义一个宏定义,-D选项可以选择不同的代码段,-DOS_LINUX
#ifdef OS_LINUX
    Codes;
#else
    Codes;
#endif

-Idir 将头文件的搜索路径扩大,包含dir目录
-Ldir将链接时使用的链接库搜索路径扩大
-static选择使用静态链接库进行链接,如果一个目录中静态库和动态库都存在
-g 调式信息
-On 优化程序,程序优化后的速度会更快,程序占用空间更小n指定优化级别
-wall == -Wl

目录
相关文章
|
1月前
|
Linux 编译器 vr&ar
Linux的动态库与静态库
静态库在编译时直接嵌入到最终的可执行文件中。
59 0
|
7月前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
1641 141
|
5月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
5月前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
121 16
|
5月前
|
存储 机器学习/深度学习 编译器
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
|
5月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
5月前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
6月前
|
XML 网络协议 API
超级好用的C++实用库之服务包装类
通过本文对Boost.Asio、gRPC和Poco三个超级好用的C++服务包装类库的详细介绍,开发者可以根据自己的需求选择合适的库来简化开发工作,提高代码的效率和可维护性。每个库都有其独特的优势和适用场景,合理使用这些库可以极大地提升C++开发的生产力。
146 11
|
8月前
|
消息中间件 存储 安全
|
Linux C++
C++ 调用Linux系统命令
一个简单的C++程序,Test函数用来测试调用Linux的系统命令ls -l #include #include #include #include #include #include using namespace std; const i...
2255 0