错误:try using -rpath or -rpath-link

25 篇文章 1 订阅
7 篇文章 0 订阅

在使用到动态库的时候,出现错误如下:

arm-linux/bin/ld: warning: libssl.so.0.9.8, needed by .//libcert.so, not found (try using -rpath or -rpath-link)

我仔细查看编译命令$(CFLAGS) –o target –L/usr/lib/ssl/ -lssl 发现是没有问题的,但是还是出现(try using -rpath or -rpath-link)的错误。

从字面意义上来看,libssl.so.0.9.8, needed by .//libcert.so, not found 意思是libcert.so库依赖libssl.so.0.9.8库。

这里看出 -Lssldir-lssl 好像没有起到作用。想知道原因需要涨点姿势,如下:

姿势点:链接选项和路径

现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。比如我们做嵌入式移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib库),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过-rpath(或-R )、LD_LIBRARY_PATH指定查找路径。

-L: “链接”的时候,去找的目录,也就是所有的 -lFOO 选项里的库,都会先从 -L 指定的目录去找,然后是默认的地方。编译时的-L选项并不影响环境变量LD_LIBRARY_PATH,-L只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径,系统还是会到默认路径下查找该程序所需要的库,如果找不到,还是会报错,类似cannot open shared object file。

-rpath-link:这个也是用于“链接”的时候的,例如你显示指定的需要 libcert.so,但是 libcert.so 本身是依赖 libssl.so库 的,后者你并没有指定,而是 libcert.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找。(注意动态库是运行时加载的哦)

-rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。对于交叉编译,交叉编译链接器需已经配置 –with-sysroot 选项才能起作用。也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时查找需要加载的动态库。-rpath-link 则只用于链接时查找。

综上所述

动态库中有复杂多个依赖关系时,最好加上-Wl,-rpath (-Wl必须加上的)。模板如下:

gcc -o foo foo.c -L/usr/local/lib -lfoo -Wl,-rpath=/usr/local/lib

$(CFLAGS) –o target –L/usr/local/ssl/lib -lssl -Wl,-rpath=/usr/local/ssl/lib

参考:https://www.cnblogs.com/flyinggod/p/8026567.html

### 回答1: k来指定程序运行时动态链接库的搜索路径。这两个选项可以在编译链接时使用,用于指定程序运行时动态链接库的搜索路径。其中,-rpath选项用于指定程序运行时动态链接库的搜索路径,-rpath-link选项用于指定程序编译链接时动态链接库的搜索路径。这两个选项可以帮助程序在运行时正确地加载所需的动态链接库,从而避免出现动态链接库加载失败的情况。 ### 回答2: -rpath和-rpath-link是两种用于设置运行时共享库搜索路径的选项。在Linux系统中,当程序运行时需要动态链接共享库(例如,libc.so,libpthread.so等),它会在默认的搜索路径(如/lib、/usr/lib等)中查找这些库。 但有时我们需要在程序运行时指定其他路径来查找共享库,例如我们自己编译的库。这时就需要用到-rpath和-rpath-link选项。 -rpath选项用于指定在运行时共享库搜索路径中添加一个目录。例如,如果我们的库文件在/usr/lib/mylib目录下,那么我们可以使用以下命令编译程序: gcc -o myprog myprog.c -L/usr/lib/mylib -lmylib -Wl,-rpath=/usr/lib/mylib 这样,当myprog程序在运行时需要加载libmylib.so库时,它会在默认路径下查找,但会优先查找/usr/lib/mylib目录。 -rpath-link选项类似于-rpath,不同的是它只影响动态链接的库文件,而不会影响程序本身的搜索路径。例如: gcc -o myprog myprog.c -L/usr/lib/mylib -lmylib -Wl,-rpath-link=/usr/lib/mylib 这样,当myprog程序在运行时需要加载它的动态链接库libmylib.so时,它会在默认路径下查找,但会优先查找/usr/lib/mylib目录。 需要注意的是,-rpath和-rpath-link选项只影响当前编译的程序,对其他程序没有影响。如果我们需要让所有程序都在指定目录下查找动态链接库,可以把目录添加到/etc/ld.so.conf文件中,然后运行ldconfig更新共享库缓存。 综上所述,-rpath和-rpath-link选项是用于设置程序运行时共享库搜索路径的重要选项,可以让我们灵活地管理自己编译的库文件。 ### 回答3: -rpath或-rpath-link是GCC编译器中的一个非常有用的选项,它可以帮助我们在编译链接时指定运行时库的搜索路径。 -rpath选项可以让我们指定一个目录,在该目录中寻找动态链接库,这样我们就可以避免在程序使用时出现“找不到库”的错误。当我们使用-rpath选项时,我们需要在链接时指定该选项,否则编译器会默认使用系统的库路径。 -rpath-link选项和-rpath类似,它可以指定链接时使用的库路径,但它只在链接时起作用,不会影响程序运行时库的搜索路径。这个选项通常用于将链接脚本中的库目录告诉运行时链接器,从而指导它在搜索库时使用正确的路径。 总的来说,使用-rpath或-rpath-link选项,可以帮助我们在程序的编译和链接过程中,指定正确的库路径,避免运行时出现找不到库的错误。 当然,使用这些选项需要我们在编写Makefile或使用自动化构建工具时,正确地指定库路径,确保程序能够正确地编译和链接。只有在使用-rpath或-rpath-link选项时,我们才能更好地控制和管理库搜索路径,确保我们的程序能够正确地运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值