找不到libcrypto库错误

时间:2012-04-29 00:15:30

标签: c linux gcc openssl shared-libraries

当我尝试编译使用带有C的命令行-lcrypto的openssl'crypto'库函数的gcc 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 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

非常感谢

2 个答案:

答案 0 :(得分:33)

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

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

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

答案 1 :(得分:10)

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

在配置openssl期间,添加' shared'选项如: ./config shared

这将创建所需的静态库libcrypto.so您将在INSTALL文件中找到更多内容;)

另外,如果您在' make'期间遇到此错误 " ....在制作共享对象时不能使用;用-fPIC"

重新编译

只需将-fPIC添加到./config例如

./config shared -fPIC

虽然我希望有人告诉我,它实际上做了什么,而且我没有搞砸了。:)