账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    linux C 未链接到本地动态库
    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 中,当你的程序试图链接本地动态库时,如果该动态库未被正确链接,那么编译器将无法找到该库,从而导致程序无法正常运行。以下是一些可能导致未链接到本地动态库的原因:

      1. 链接器问题:确保你已经正确安装了编译器的链接器选项。例如,如果你使用的是 GCC,你需要在你的编译命令中添加 -l 动态库名称,例如:gcc my_program.c -lmy_library

      2. 动态库的位置:如果你的动态库位于一个不正确的位置,那么编译器将无法找到它。确保你的动态库在你的系统中是可访问的。

      3. 动态库版本:有些编译器在链接本地动态库时,需要指定动态库的版本。确保你的动态库是与你的程序兼容的版本。

      4. 动态库权限:有些动态库需要特定的权限才能被链接。确保你的动态库在你的系统中是可访问的,并且你有足够的权限来运行你的程序。

      如果你已经尝试了上述解决方案,但仍然遇到问题,你可能需要更深入地检查你的代码和系统设置。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部