将蚊子库链接到Linux上的hello.c程序



我正在尝试用我的自定义c程序编译蚊库。所以我写了一个hello.c文件,git从下面的仓库克隆了最新的蚊库:

https://github.com/eclipse/mosquitto.git

并使用make命令编译如下:

make

我不得不删除doc目标,因为它要求一些依赖库。我在这台机器上没有管理员权限,因此不想被任何依赖库阻塞。在编译之后,我得到的是:

src/mosquitto 
./lib/libmosquitto.so.1  

我复制了libmosquito .so。将一个共享库放入本地文件夹~/hello/:

~/hello$ cp ~/mosquitto/lib/libmosquitto.so.1 .

然后在~/hello/中写了一个hello.c,如下所示:

#include <stdio.h>
int main()
{
printf("Hello Worldn");
return 0;
}
我可以编译hello.c并像下面这样运行:

gcc -o hello hello.c
./hello
Hello World

但是如果我尝试将二进制文件与蚊子库链接起来,我会得到如下错误:

gcc -o hello hello.c -lmosquitto
/usr/bin/ld: cannot find -lmosquitto
collect2: error: ld returned 1 exit status

libmosquitto.so。1与hello.c位于同一个文件夹中。我不想安装蚊库,而希望保持在一个本地文件夹,并能够链接它。我也试过下面的,希望-L。将链接器指向共享库文件的当前目录,但仍然得到相同的错误:

gcc -o hello hello.c -L. -lmosquitto
/usr/bin/ld: cannot find -lmosquitto
collect2: error: ld returned 1 exit status

我的最终目标是为arm目标交叉编译库。所以真的需要了解共享库的链接是如何失败的,这样我就可以在交叉编译和链接目标时使用相同的体验。目前,我正在x86平台上进行此操作。有人能帮忙吗?

/usr/bin/ld: cannot find -lmosquitto

链接器不查找libmosquitto.so.1—它只查找libmosquitto.alibmosquitto.so

解:ln -s libmosquitto.so.1 libmosquitto.so

./pub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory

这里的问题是运行时加载器不会在当前目录中查找libmosquitto.so.1——它只会在系统配置的目录中查找。

您可以通过添加export LD_LIBRARY_PATH=$HOME/mosquitto/lib来解决这个问题,但这是次优的——您的二进制文件是否工作取决于环境。

一个更好的解决方案是像这样修改链接命令:
gcc -o hello hello.c -L. -lmosquitto -Wl,-rpath=$HOME/mosquitto/lib