【问题标题】:Error when cross compiling shared so which depends on another so交叉编译时出错 shared so 依赖于另一个 so
【发布时间】:2021-09-28 09:04:59
【问题描述】:

我正在尝试为基于 arm 的系统交叉编译我的应用程序。

我有 2 个按以下方式编译的库:

$ gcc -shared --sysroot=$DIR_PATH -o $LIBPATH/libfoo.so foo.o
$ gcc -shared --sysroot=$DIR_PATH -o $LIBPATH/libbar.so bar.o

编译第三个库:

gcc -shared -o $LIBPATH/libfoobar.so --sysroot=$DIR_PATH -L$LIBPATH -Wl,rpath=$RUN_TIME_PATH foobar.o -lfoo -lbar 

最后我编译了一个二进制文件:

gcc -o app --sysroot=$DIR_PATH -L$LIBPATH -Wl,rpath=$RUN_TIME_PATH app.o -lfoobar

但是在编译应用程序时我得到了

warning: libfoo.so, needed by libfoobar.so, not found (try using -rpath or -rpath-link)

【问题讨论】:

  • 您的意思是,在链接app 时会出现该错误,而不是在编译app.o 时?
  • 我们无法帮助您,因为您没有告诉我们 (a) 各种库在哪个目录中,以及 (b) $LIBPATH 的值是什么。如果库不在$LIBPATH 中,那就是问题所在。如果它们在当前工作目录中,并且与$LIBPATH 不同,那么您需要将-L. 添加到链接行,链接器才能找到它们。
  • 是的。我的意思是应用程序。
  • LIBPATH=/home/user/proj_dir/ShOb RUN_TIME_PATH=/usr/lib(在目标上)
  • 运行时路径与此问题无关,因为它仅在您运行程序时生效。在这里,您正在链接程序。您没有告诉我们调用链接命令的工作目录是什么。是/home/user/proj_dir/ShOb吗?如果不是,那么这就是您的问题,因为您的库位于本地目录中,但本地目录并未提供给链接器作为查找库的位置(通过 -L)。

标签: makefile cross-compiling gnu


【解决方案1】:

我相信您需要使用-Wl,-rpath-link=$LIBPATH 告诉链接器在链接操作期间到哪里寻找解析运行时库引用。

更多信息可以在ld文档中找到:https://sourceware.org/binutils/docs-2.37/ld/Options.html

【讨论】:

  • 修复了它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2014-03-05
相关资源
最近更新 更多