找不到 libcrypto 库错误

Posted

技术标签:

【中文标题】找不到 libcrypto 库错误【英文标题】:Cannot find libcrypto library error 【发布时间】:2012-05-09 06:23:50 【问题描述】:

当我试图编译一个C 代码,它使用带有命令行-lcryptogcc 4.4.3 的openssl 'crypto' 库函数,它给出了一个错误

`@ubu:$ gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -lcrypto -o aes
 /usr/bin/ld: cannot find -lcrypto
 collect2: ld returned 1 exit status`

这可能是什么原因??

我已经完成了这个讨论ld cannot find an existing library,但这并没有帮助。

定位命令结果

$ locate libcrypto
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.a
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.pc
/lib/libcrypto.so.0.9.8
/lib/i486/libcrypto.so.0.9.8
/lib/i586/libcrypto.so.0.9.8
/lib/i686/cmov/libcrypto.so.0.9.8
/usr/lib/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/local/ssl/lib/libcrypto.a
/usr/local/ssl/lib/pkgconfig/libcrypto.pc

有人可以帮忙解决这个问题或指出我做的任何错误

@Daniel Roethlisberger 尝试使用 -L 标志,但导致这些错误

gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -L /usr/local/ssl/lib -lcrypto -o aes
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
dso_dlfcn.c:(.text+0x2d): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x43): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x4d): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr':
dso_dlfcn.c:(.text+0x8f): undefined reference to `dladdr'
dso_dlfcn.c:(.text+0xe9): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
dso_dlfcn.c:(.text+0x4b1): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x590): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var':
dso_dlfcn.c:(.text+0x611): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x6f0): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload':
dso_dlfcn.c:(.text+0x755): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load':
dso_dlfcn.c:(.text+0x837): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x8ae): undefined reference to `dlclose'
dso_dlfcn.c:(.text+0x8f5): undefined reference to `dlerror'
collect2: ld returned 1 exit status

非常感谢

【问题讨论】:

我认为您需要一个没有版本号的符号链接。 This whitepaper 可能会有所帮助。 @jedwards 好的,但实际上我应该在哪里创建该符号链接 ..我的意思是该库出现在许多位置的文件夹(见上文,离开 vmware* 和下载文件夹)谢谢 坏主意,针对 1.0.1b 标头构建并针对 0.9.8 共享对象进行链接,这将导致问题(如果它完全构建的话)。 当然,您应该链接到(在 gcc 中)您正在构建的相同版本。除非您针对 0.9.8 以外的版本进行构建,否则将 /usr/lib/libcrypto.so 符号链接到 /usr/lib/libcrypto.so.0.9.8 可以正常工作 执行最终链接时需要添加-ldl 【参考方案1】:

这可能与尝试从源代码构建自己的 openssl 然后使用它来编译其他程序(在我的情况下为 Git)的人有关

在配置openssl时,添加'shared'选项:

./config shared

这将创建所需的共享库libcrypto.so。您可以在 INSTALL 文件中找到更多信息。

另外,如果你在“make”过程中遇到这个错误

"....can not be used when making a shared object

使用 -fPIC 重新编译

./config shared -fPIC

【讨论】:

评论其他疯子,他们不得不将 git 先决条件(如 libiconv)从源代码编译到非标准位置。在这种情况下,您需要在 git Makefile 中修改 CFLAGS 和 LDFLAGS。添加 '-liconv -lcurl' 到 CFLAGS 和 LDFLAGS= -L_your_path_to_lib 这个解决方案适用于那些试图编译tomcat原生库的人(这个评论主要是给搜索引擎的)【参考方案2】:

在 GCC 命令行中添加 -L /usr/local/ssl/lib/,在 -lcrypto 之前。由于您是针对 /usr/local/ssl 下的 OpenSSL 标头进行构建的,因此您还需要链接到具有相同前缀的实际库(即使您似乎只在那里安装了一个静态库,这可能是也可能不是您的意图;您可能需要正确重新安装从源代码构建的 OpenSSL)。

(编辑)要修复链接器找不到的dlopen() 和朋友,请将-ldl 添加到GCC 命令行中。 -ldl 告诉链接器也链接到 libdl.so,这是包含 dlopen()dlsym()dlclose() 等的共享库;这些函数由 OpenSSL 在内部使用,因此,-ldl 是使用 -lcrypto(在 Linux 上)时的间接依赖。因为您要链接到 libcrypto 的静态版本,所以您需要显式链接所有间接依赖项。

如果您不熟悉链接到正确的库,我建议您使用从操作系统包管理器安装的 OpenSSL;它可能会为您节省一些麻烦。

【讨论】:

查看我对原始问题帖子的编辑,了解我在使用 -L 标志后遇到的错误......我做错了什么......谢谢你的回答 -ldl 用 -L /path/ flag 解决了这个问题..你能解释一下 -ldl 实际上做了什么吗。非常感谢你再次回答我的一个问题.. @abhi -ldl 指示链接器将 dl 库链接到您的输出。在这种特殊情况下,它告诉链接器“按名称”添加它,而不是像 -L 命令行参数那样“按路径”添加

以上是关于找不到 libcrypto 库错误的主要内容,如果未能解决你的问题,请参考以下文章

关于找不到库文件

Eclipse Pydev:'错误:找不到 Python 标准库'

Xcode Swift 包管理器错误 - 找不到存储库

错误:找不到 jdk 库路径

Ejabberd 配置:错误:找不到 libyaml 库

错误 - 找不到“/struts-tags”的标签库描述符