在 Windows 操作系统里,我们通常称其为动态链接库,扩展名为 .dll;而在 UNIX 或 Linux 环境下,它则被称为共享库,后缀为 .so。虽然名称各异,但核心功能完全一致——让多个程序共享同一份代码,从而节省内存并简化更新维护。
那么,如何将自己编写的 C 语言源码编译成一个共享库呢?只需一条简单的命令:
gcc -o libme.so wso.c -shared
这条命令将 wso.c 编译生成名为 libme.so 的动态链接库,其中库名部分为 me(请留意命名惯例:前缀加 lib,后缀加 .so,这是行业约定)。
联合编译步骤
共享库制作完成后,需要将其与主程序一同编译。例如:
gcc -L /root/myc/ -l me ws.c -o newws
参数解释:-L 用于指定动态链接库所在的文件夹路径;-l 用于指定库名(去除开头的 lib 以及结尾的 .so,剩下的即为库名)。
编译通常能够顺利完成,但先别急着庆祝——运行时极大概率会出问题。你会发现 newws 程序报告错误,提示找不到共享库。
失败根源:操作系统无法定位库文件
实际上,Linux 和 Windows 类似,也存在一个“系统库目录”,相当于 C:\Windows\System32。所有公共动态库都必须放置在这些目录下,系统才能自动查找并加载。以 CentOS 为例,主要有三个存放公共库的标准位置:
/lib—— 内核级别/usr/lib—— 用户系统级别/usr/lib64/—— 64位系统专用
当然,你也可以随意将库文件放在其他路径,但系统默认不会去搜索那些位置。
解决方案
解决这一问题的最直接方法,就是将 .so 文件复制到公共库目录下,比如 /usr/lib 或 /usr/lib64。复制完成后,还需要执行一条命令:
ldconfig
该命令的作用是刷新动态库缓存——系统会登记新加入的库,使其在后续运行时能够被准确找到。之后再次运行 newws,一切便会正常。
简要总结:编译阶段使用 -L 和 -l 分别指定路径和库名;运行阶段确保库文件位于系统默认搜索路径中,或通过 ldconfig 注册到缓存。这些是 Linux 动态链接库最基础的操作方法,掌握之后,更复杂的项目开发便能水到渠成。
