24

当我尝试编译使用带有命令行的Copenssl 'crypto' 库函数的代码时,会出现错误-lcryptogcc 4.4.3

`@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 找不到现有的库,但这没有帮助。

定位命令导致

$ 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

非常感谢

4

2 回答 2

33

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

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

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

于 2012-04-29T00:25:06.453 回答
11

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

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

./config shared

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

此外,如果您在“制作”期间遇到此错误

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

使用 -fPIC 重新编译

./config shared -fPIC

于 2014-05-28T05:38:13.633 回答