3

使用供应商提供的交叉编译工具链(显然是 OpenEmbedded 衍生工具),我无法嵌入第三方(开源,内部编译)库的绝对路径。使用以下 gcc 命令行:

arm-linux-gcc test_connect_send.o gprs_connect.o \
    /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libgprs_stuff.so \
    /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libpower_supply_stuff.so \
    /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libgsm_stuff.so \
    /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libtcp_stuff.so \
    /package/host/aspl.es/vortex-1.1.0/lib/libvortex-1.1.so \
    /package/host/aspl.es/axl-0.5.6/lib/libaxl.so.0  -o test_connect_send

objdump 说:

Dynamic Section:
  NEEDED      /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libgprs_stuff.so
  NEEDED      /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libpower_supply_stuff.so
  NEEDED      /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libgsm_stuff.so
  NEEDED      /package/host/myvendor.com/API-R-2.0.0/Release/Libraries/libtcp_stuff.so
  NEEDED      libvortex-1.1.so.0
  NEEDED      libaxl.so.0
  NEEDED      libgcc_s.so.1
  NEEDED      libc.so.6

请注意我的供应商的库确实有完整的路径,而 aspl 没有。另外,请注意嵌入的名称与我在命令行中指定的名称有何不同。我想知道为什么(谁在弄乱我的路径),以及如何解决它。

ps:我知道RPATH,这不是我要找的答案

4

3 回答 3

1

我的猜测是供应商提供的库将 SONAME 设置为完整安装路径。

于 2009-08-02T00:22:17.627 回答
0

arm-linux-gcc -print-file-name 没有显示任何令人惊讶的内容:

arm-linux-gcc -print-file-name=/package/host/aspl.es/axl-0.5.6/lib/libaxl.so.0.0.0 /package/host/aspl.es/axl-0.5.6 /lib/libaxl.so.0.0.0 arm-linux-gcc -print-file-name=/package/host/aspl.es/axl-0.5.6/lib/libaxl.so.0.0 /package/host/aspl .es/axl-0.5.6/lib/libaxl.so.0.0 arm-linux-gcc -print-file-name=/package/host/aspl.es/axl-0.5.6/lib/libaxl.so.0 /package/host/aspl.es/axl-0.5.6/lib/libaxl.so.0 arm-linux-gcc -print-file-name=/package/host/aspl.es/axl-0.5.6/lib /libaxl.so /package/host/aspl.es/axl-0.5.6/lib/libaxl.so

生成的二进制文件在没有定义 LD_LIBRARY_PATH 的情况下无法运行,也没有 DT_RPATH (尽管这肯定有帮助,建议?)

我不想依赖 /etc/ld.so.conf 被正确设置,因此我想要到处都是绝对路径。

请注意,建议很可能指向第三方库的编译,截至目前,这些库是用以下方式编译的:

使 distclean;LDFLAGS=-L/package/host/myvendor.com/arm9-linux-toolchain-2.1/prefix/arm-linux/lib CC=/package/host/myvendor.com/arm9-linux-toolchain-2.1/prefix/bin /arm-linux-gcc ~/wd/sources/contrib/axl/configure --prefix=/shared/syst/arm9-linux-abtrack/package/host/aspl.es/axl-0.5.6 --host=armv4tl -unknown-linux-gnu --disable-axl-knife --disable-axl-babel --disable-axl-log --disable-axl-test && make

使 distclean;AXL_LIBS="-L/shared/syst/arm9-linux-abtrack/package/host/aspl.es/axl-0.5.6/lib/ -laxl -lm" AXL_CFLAGS=-I/shared/syst/arm9-linux- abtrack/package/host/aspl.es/axl-0.5.6/include/axl CC=/package/host/myvendor.com/arm9-linux-toolchain-2.1/prefix/bin/arm-linux-gcc LDFLAGS=" -L/package/host/myvendor.com/arm9-linux-toolchain-2.1/prefix/arm-linux/lib" ~/wd/sources/contrib/vortex/configure --prefix=/shared/syst/arm9-linux -abtrack/package/host/aspl.es/vortex-1.1.0 --disable-http-support --disable-pull-support --disable-tunnel-support --disable-xml-rpc-support-gen -- disable-xml-rpc-support --disable-sasl-support --disable-vortex-log --disable-vortex-client --host=armv4tl-unknown-linux-gnu && make

在编译库中嵌入 --prefix 的任何 autofoo 提示?

于 2009-07-27T08:33:10.307 回答
0

这是一个老问题,但我想无论如何我都会添加一个可能的答案。

仅根据您提供的信息,是否因为您指定的 aspl 库是软链接而没有包含 aspl 的完整路径名?例如,如果您在 /package/host/aspl.es/vortex-1.1.0/lib/libvortex-1.1.so 上列出很长的列表,它将显示它是指向 libvortex-1.1.so.0 的链接(带有没有完整的路径名)。

因此,如果您仍想嵌入完整路径,则需要使用实际库的完整路径,而不是链接库。

于 2009-11-10T14:10:27.090 回答