找不到 libcrypto 库错误
Posted
技术标签:
【中文标题】找不到 libcrypto 库错误【英文标题】:Cannot find libcrypto library error 【发布时间】:2012-05-09 06:23:50 【问题描述】:当我试图编译一个C
代码,它使用带有命令行-lcrypto
和gcc 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 库错误的主要内容,如果未能解决你的问题,请参考以下文章