链接器无法找到库 - 使用正确的搜索路径

Linker fails to find library - with correct searchpath

提问人:Benjamin Larsen 提问时间:4/28/2022 最后编辑:Benjamin Larsen 更新时间:4/29/2022 访问量:628

问:

我遇到了一个神秘的问题。 在必须编译一些库以在 Android 设备上使用时,我遇到了一些代码和 OpenSSL 之间的链接问题。

我首先使用独立的工具链将 OpenSSL 编译到 Android,如此处所述。然后,我必须将其与另一个库链接,我将其配置为使用相同的工具链。

./configure --host=aarch64-linux-android CPPFLAGS="-I/tmp/openssl-OpenSSL_1_1_1n/include -DDEBUG" LDFLAGS=-L/tmp/openssl-OpenSSL_1_1_1n

这配置正常,然后我运行 .make

现在弹出了有趣的事情 - 链接器找不到我的库,如以下错误消息所示。

libtool: link: aarch64-linux-android-gcc -DDEBUG -g -O2 -o .libs/credentialmanager credentialmanager-credentialmanager.o  -L/tmp/openssl-OpenSSL_1_1_1n ./.libs/libcredentialutils.so ./.libs/libcredentialstack.so -L/usr/local/lib
/tmp/ndk-benlar/aarch64-linux-android/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libcrypto.so.1.1, needed by ./.libs/libcredentialutils.so, not found (try using -rpath or -rpath-link)

我注意到它有两个“-L”标志,但是查看手册页,它应该只将其添加到搜索路径中,而不是替换它。

-L <dir>                Add directory to library search path

在我的临时目录中查看,我确实看到库位于那里。

lrwxrwxrwx  1 user user      16 Apr 28 11:58 libcrypto.so -> libcrypto.so.1.1

-rwxrwxr-x  1 user user 2754192 Apr 28 11:58 libcrypto.so.1.1

为什么链接器抱怨找不到库,当它显然在正确的文件夹中查找时,文件是正确的名称,工具链是相同的。

生成文件 链接 链接器错误

评论

0赞 MadScientist 4/28/2022
您实际上没有向我们显示任何错误消息,因此无法提供帮助。
0赞 Benjamin Larsen 4/28/2022
@MadScientist woups - 忘记了第二行。错误的其余部分只是未定义的引用。
0赞 Vroomfondel 4/29/2022
您是否尝试将最后一个元素放在命令行中?至少对于静态库,我认为请求的符号需要满足在请求之后而不是在请求之前提供的对象。-L/tmp/openssl-OpenSSL_1_1_1n
0赞 MadScientist 4/29/2022
那无济于事。 不包含任何库,它只设置要搜索的路径。它是(小写 ell)实际上包括库和顺序很重要的地方。-L-l

答:

2赞 MadScientist 4/29/2022 #1

错误消息会提示您有关该问题的提示。该选项告诉链接器在哪里可以找到要链接的库,但这不是这里的问题。您没有链接(您的链接行上没有)。您正在链接 ,并且库已链接到 。-Llibcrypto-lcryptocredentialutilscrypto

是该库找不到所需的库。

您需要在库上设置 rpath,以便它知道要查找的位置,或者将加密库复制到可以找到它的位置,或者将环境变量设置为指向其位置,或者调用链接器并指向要查找的正确位置。credentialutilsLD_LIBRARY_PATH-rpath

评论

0赞 Benjamin Larsen 4/29/2022
查看输出时,我看到以下内容:/bin/bash ../libtool --tag=CC --mode=link aarch64-linux-android-gcc -fPIC -DTPM_TPM20 -DTPM_TPM12 -DTPM_POSIX -g -O2 -version-info 7:0:6 -L/tmp/openssl-OpenSSL_1_1_1n -o libcredentialutils.la -rpath /usr/local/lib libcredentialutils_la-cryptoutils.lo libcredentialutils_la-ekutils.lo libcredentialutils_la-imalib.lo libcredentialutils_la-eventlib.lo libicredentialutils_la-efilib.lo libcredentialmanager.la -lcrypto 这不会失败。我看到 rpath 指向不同,即使设置了 -L - 但复制到路径不起作用......
0赞 MadScientist 4/30/2022
您必须在脑海中清楚地将链接时搜索路径运行时搜索路径区分开来。创建 .so 或可执行文件时,可以链接它,并在链接时搜索路径中搜索在链接行中列出的库,该路径用 指定。但是,这些路径都不会自动添加到运行时搜索路径中。加载您创建的库或二进制文件时,将查询运行时搜索路径。-L
0赞 MadScientist 4/30/2022
根据上述信息,如果将文件复制到 ,它应该可以工作,这是 的运行时链接路径,因此需要搜索需要加载的库。当然,也有可能是其他东西改变了它。你应该运行并看到它被找到。更多信息在这里: codeyarns.com/tech/...libcrypto.so.1.1.1/usr/local/libcredentialutilscredentialutilsldd libcredentialutils.solibcrypto
0赞 Benjamin Larsen 5/10/2022
我同意它应该起作用。文件 /usr/local/lib/libcrypto.so.1.1 /usr/local/lib/libcrypto.so.1.1:ELF 64 位 LSB 共享对象,ARM aarch64,版本 1 (SYSV),动态链接,未剥离。它是正确的类型,它存在,但仍然相同的结果。