转自:http://www.2cto.com/os/201308/238936.html
在linux下制作动态库*.so。
1、linux下动态库的制作
//so_test.h #include "stdio.h" void test_a(); void test_b(); void test_c();
//test_a.c #include "so_test.h" void test_a() { printf("this is in test_a...\n"); }
//test_b.c #include "so_test.h" void test_b() { printf("this is in test_b...\n"); }
//test_c.c #include "so_test.h" void test_c() { printf("this is in test_c...\n"); }
生成动态库:libtest.so
# gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
2、动态库与头文件位置
# cp libtest.so /lib/
# cp so_test.h /usr/include/
3、动态库的链接
测试程序
//test.c #include <so_test.h> int main() { test_a(); test_b(); test_c(); return 0; }
将test.c与动态库libtest.so链接生成执行文件test:
# gcc test.c -L. -ltest -o test
测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
# ldd test
4、编译参数解析
-shared:
该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号);
不用该标志外部程序无法连接,相当于一个可执行文件;
-fPIC:
表示编译为位置独立的代码;
不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的;
-L.:
表示要连接的库在当前目录中
-ltest:
编译器查找动态连接库时---隐含的命名规则[注释:libtest.so == -ltest / libhello.so == -lhello ]
LD_LIBRARY_PATH:
这个环境变量指示动态连接器可以装载动态库的路径。
修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
2013-01-10 Stage3D中用位图滤镜为动态文本描边
2013-01-10 flash.system.ImageDecodingPolicy 异步解码图像,载入大图时有用
2013-01-10 Starling 性能优化方案
2010-01-10 成为群体领袖