【Linux下的动态链接和静态链接 及 调用libevent库函数的可执行文件无法正常运行情况剖析】

在运行使用了evconnlistener_new_bind(buffer event链接侦听器)的可执行程序时,会出现以下报错。主要原因就如同提示说的一样,无法打开共享库,或者说无法链接到动态库。

所以借此描述一下Linux下的动态链接库和静态链接库,以及如何生成这个libevent-2.0.so.5 动态链接库文件(其实前面安装libevent步骤讲到过)

./libevent_Web: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

在Linux下,静态链接(Static Linking)和动态链接(Dynamic Linking)是两种常见的链接方式,用于将程序中的代码和数据与其他代码和数据组合起来以创建可执行文件或共享库。以下是关于这两种链接方式的详细说明:

静态链接 (.a)

定义:

静态链接是指在编译时,将程序所依赖的函数或数据直接复制到最终的可执行文件中。这意味着可执行文件包含了程序运行所需的所有代码和数据。

特点:

  1. 独立性:由于所有的代码和数据都被包含在了可执行文件中,因此可执行文件不依赖于外部的库文件。
  2. 体积大:因为包含了所有依赖的代码和数据,所以生成的可执行文件通常比较大。
  3. 更新困难:如果某个库文件被更新了,所有依赖于这个库的可执行文件都需要重新编译和链接。

示例:

在GCC中使用-static选项来指定静态链接。但是,不是所有的库都提供静态版本,所以你可能需要确保你的系统上安装了相应的静态库文件(通常以.a为扩展名)。

gcc -static my_program.c -o my_program

动态链接 (.so)

定义:

动态链接是指在运行时,程序所依赖的函数或数据从外部的共享库(shared library)中加载。这意味着可执行文件只包含了必要的引用信息,而实际的代码和数据则存储在外部的共享库中。

特点:

  1. 节省空间:由于多个可执行文件可以共享同一个库文件,所以总的磁盘空间占用会减少。
  2. 更新方便:如果某个库文件被更新了,只需要替换掉旧的库文件,所有依赖于这个库的可执行文件都可以立即使用新的库。
  3. 依赖性强:由于可执行文件依赖于外部的库文件,所以在没有这些库文件的系统上,可执行文件可能无法运行。

示例:

在GCC中,默认就是使用动态链接。你可以使用-shared选项来创建共享库,使用-L和-l选项来指定链接时搜索的库路径和库名。

创建共享库:
gcc -shared -o libmylib.so mylib.c
链接共享库:
gcc my_program.c -L/path/to/libs -lmylib -o my_program
在这个例子中,-L/path/to/libs指定了链接器搜索库文件的路径,-lmylib指定了要链接的库名(不包括前缀lib和后缀.so)。

回到开头的问题

运行可执行文件时,当读到动态库部分时,需要动态载入动态库,最简单的方法就是把这个动态库libevent-2.0.so.5 放到你的可执行文件同目录下~

当然,针对动态库链接还有其它五种方法,这里就不进行深层次的说明了。(后续可能专门写一期)

总结

Linux和Windows系统下的动态库、静态库原理类似,不过不同系统下后缀不同,同时链接、创建的方式也不同:

Linuxwindows
静态库.a.lib
动态库.so.dll
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flos chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值