C语言那些事之动态库

相关参考链接

  • https://www.cnblogs.com/bwbfight/p/14279192.html

检查可执行程序所依赖的库

ldd test

For checking the direct dependencies you should use readelf instead of ldd because ldd also shows the indirect dependencies.

$ readelf -d main | grep library
0x0000000000000001 (NEEDED)             Shared library: [libB.so]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

ldd also shows the indirect dependencies

$ LD_LIBRARY_PATH=. ldd ./main
linux-vdso.so.1 (0x00007fff13717000)
libB.so => ./libB.so (0x00007fb6738ed000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb6734ea000)
libA.so => ./libA.so (0x00007fb6732e8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb673af0000)

vim /etc/ld.so.conf ,添加动态库搜索路径

include ld.so.conf.d/*.conf
./

加载改配置文件、或者使刚放进指定 lib 目录下的库生效

ldconfig

指针中 的一二

// 声明一个int指针
int *ptr;
// 声明一个int值
int val = 1;
// 为指针分配一个int值的引用
ptr = &val;
// 对指针进行取值,打印存储在指针地址中的内容
int deref = *ptr;
printf("%d\n", deref);
gcc -ldl 选项作用

如果你的程序中使用dlopen、dlsym、dlclose、dlerror 显示加载动态库,需要设置链接选项 -ldl

排错实例
错误case
 cannot open shared object file: No such file or directory 
java.lang.UnsatisfiedLinkError

排查

# ldd jnilib-5396747697750461123.tmp
        linux-vdso.so.1 (0x00007ffc24bb4000)
        libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4 (0x00007f356443b000)
        libssl.so.10 => not found
        libcrypto.so.10 => not found

解决方案:
scp lib from server which contains these libs

错误case
java.lang.UnsatisfiedLinkError: /tmp/spark_columnar_plugin_7587110115385153789/libspark_columnar_jni.so: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /tmp/spark_columnar_plugin_7587110115385153789/libspark_columnar_jni.so

解决方案:

export LD_LIBRARY_PATH=/root/miniconda2/envs/gazelle_arrow4.0/lib/:/root/miniconda2/envs/gazelle_arrow4.0/lib64/
错误case
/home/sparkuser/miniconda3/envs/arrow-new/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /home/sparkuser/miniconda3/envs/arrow-new/lib/libcrypto.so.1.1: undefined reference to `__fdelt_chk@GLIBC_2.15'
/home/sparkuser/miniconda3/envs/arrow-new/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /home/sparkuser/miniconda3/envs/arrow-new/lib/libcrypto.so.1.1: undefined reference to `memcpy@GLIBC_2.14'
/home/sparkuser/miniconda3/envs/arrow-new/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /home/sparkuser/miniconda3/envs/arrow-new/lib/libcrypto.so.1.1: undefined reference to `clock_gettime@GLIBC_2.17'
/home/sparkuser/miniconda3/envs/arrow-new/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /home/sparkuser/miniconda3/envs/arrow-new/lib/libcrypto.so.1.1: undefined reference to `getauxval@GLIBC_2.16'
/home/sparkuser/miniconda3/envs/arrow-new/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /home/sparkuser/miniconda3/envs/arrow-new/lib/libcrypto.so.1.1: undefined reference to `secure_getenv@GLIBC_2.17'
collect2: error: ld returned 1 exit status
make[2]: *** [src/tests/CMakeFiles/TestJniUtils.dir/build.make:107: src/tests/TestJniUtils] Error 1
make[1]: *** [CMakeFiles/Makefile2:451: src/tests/CMakeFiles/TestJniUtils.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值