我正在尝试用我的自定义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.a
或libmosquitto.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