linux共享库的编译


       linux下的库有两种:静态库和共享库。共享库,一般也被称为动态链接库。
       静态库的代码在编译过程中已经被载入可执行程序,因此体积较大,一般以libxxxx.a形式存在。
      共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小,一般以libxxxx.so的文件形式存在。

      库是别人写好的现有的,成熟的,可以复用的代码。实际项目开发中,每个程序都要依赖很多基础的底层库,不需要每个程序员去重新发明轮子,因此库的存在意义非同寻常。

      共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

       ldd命令可以查看一个可执行程序依赖的共享库,

例如:


     要自己编写一个动态链接库,以供多个进程或其他程序员使用,分为以下两步:

 (1)编写代码,包括头文件和源文件;

 (2)将一步中编写的源代码文件编译成一个动态库:libXXXX.so。

     下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test.c(实际项目中一般有更多头文件和源文件,我们稍后将这几个文件编译成一个动态库libtest.so),以及一个测试文件:test_main.c 。

    共享库头文件:

#include "stdio.h"
void test();

   源文件:test.c:

void MyTestFunction()
{    
   printf("this is in test for shared object... ");
}


最后,将以上文件编译成一个动态链接库libtest.so,以方便别人可以直接使用这三个接口:


$ gcc test.c -fPIC -shared -olibtest.so

 

到此为止,大功基本高成,动态链接库已经成功生成了。  

### 解决Linux编译时依赖库问题的方法 #### 了解所需工具和环境准备 对于特定软件包的编译,如GDAL库,在Linux环境下需要确保拥有适当版本的GCC以及其他必要的构建工具。Ubuntu系统上可以通过如下命令来安装基本的编译环境: ```bash sudo apt-y build-essential ``` 这一步骤能够提供诸如`gcc`, `g++`, 和其他支持程序[^3]。 #### 安装具体项目所需的额外依赖项 针对不同类型的库或应用程序,可能还需要额外的依赖关系。例如,当涉及到地理空间数据处理的GDAL库时,除了基础编译器外,还需考虑其特有的需求。通常情况下,官方文档会列出所有必需的外部资源列表;如果没有,则可以参考社区经验或者尝试逐步解决问题。对于GDAL而言,可能会涉及PROJ、GEOS等地理信息系统组件的支持[^1]。 #### 正确设置链接选项 在编写Makefile或其他形式的构建脚本时,应明确指定要使用的静态/共享库及其位置。如果遇到找不到符号定义的情况(即未解析的引用错误),则可能是由于缺少正确的-L标志指明库目录或是-l参数声明目标库名所致。另外值得注意的是,并非总是需要显式提及每一个间接依赖——只需关注直接关联的部分就足够了[^4]。 #### 处理复杂的第三方库集成情况 像FFmpeg这样的多媒体框架不仅本身复杂度高,而且经常伴随着一系列辅助性的编码解码插件。为了顺利完成整个系统的组装工作,建议按照一定顺序依次完成各个子模块的准备工作,比如先搞定x264/x265这类视频压缩标准实现后再着手主体部分。这样做有助于减少潜在冲突并简化调试流程[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值