- 72
- 0
我在项目中需要链接一个动态库
gcc -o test main.c -lsmbclient -ltalloc -ltevent
提示错误
/usr/bin/ld: 找不到 -lsmbclient
collect2: error: ld returned 1 exit status
没有找到库的路径,所以使用 -L 添加库的路径
gcc -o test main.c -L. -lsmbclient -ltalloc -ltevent
编译成功,但执行的时候出现问题。猜想可能是LD_LIBRARY_PATH变量未设置的问题
根据 https://www.cprogramming.com/...
设置变量,并且能够肯定变量值设置成功,程序正常运行,但结果还是不正确。
执行
ldd test | grep smbclient
libsmbclient.so.0 => /usr/lib/x86_64-linux-gnu/libsmbclient.so.0 (0x00007fdbb6561000)
程序链接的是系统中的库而不是本地的库,所以执行结果不对。
但我设置了$LD_LIBRARY_PATH的值并没用。
我又测试了使用 rpath 参数设置路径,但ldd的结果还是不对
链接器读取到了-L设置了库的路径,并且找到了库,那为何链接进去的值是系统的?求助!!!
$ pwd
/home/chenzhen/packSource/my_samba
$ ls
get_auth_data_fn.h libsmbclient.h libsmbclient.so libtalloc.so libtevent.so main.c test
$ echo $LD_LIBRARY_PATH
:/home/chenzhen/packSource/my_samba/
$ gcc -L/home/chenzhen/packSource/my_samba -Wl,-rpath=/home/chenzhen/packSource/my_samba -Wall -o test main.c -lsmbclient -ltalloc -ltevent
$ ldd -r test
libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f1d5ae2c000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f1d5ac27000)
libwind.so.0 => /usr/lib/x86_64-linux-gnu/libwind.so.0 (0x00007f1d5a9fd000)
................中间省略70条左右
libhx509.so.5 => /usr/lib/x86_64-linux-gnu/libhx509.so.5 (0x00007f1d5a5a6000)
libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007f1d5a2ec000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f1d5a0b3000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f1d59eaa000)
undefined symbol: smbc_notifydir (./test)
$ objdump -tT libsmbclient.so | grep smbc_notify
0000000000048c1e g F .text 000000000000001e smbc_notifydir
0000000000048c1e g DF .text 000000000000001e Base smbc_notifydir
系统库是没有这个函数的,我加入的,本地的库可以通过objdump看到
1
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
遇海棠 普通会员 1楼
在 Linux 中,当你的程序试图链接本地动态库时,如果该动态库未被正确链接,那么编译器将无法找到该库,从而导致程序无法正常运行。以下是一些可能导致未链接到本地动态库的原因:
-
链接器问题:确保你已经正确安装了编译器的链接器选项。例如,如果你使用的是 GCC,你需要在你的编译命令中添加 -l 动态库名称,例如:
gcc my_program.c -lmy_library -
动态库的位置:如果你的动态库位于一个不正确的位置,那么编译器将无法找到它。确保你的动态库在你的系统中是可访问的。
-
动态库版本:有些编译器在链接本地动态库时,需要指定动态库的版本。确保你的动态库是与你的程序兼容的版本。
-
动态库权限:有些动态库需要特定的权限才能被链接。确保你的动态库在你的系统中是可访问的,并且你有足够的权限来运行你的程序。
如果你已经尝试了上述解决方案,但仍然遇到问题,你可能需要更深入地检查你的代码和系统设置。
-
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

