当我试图编译一个使用openssl 'crypto‘库函数的C代码时,它给出了一个错误
`@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非常感谢
发布于 2012-04-29 08:25:06
在-lcrypto之前,将-L /usr/local/ssl/lib/添加到GCC命令行中。由于您是针对/usr/local/ssl下的OpenSSL头文件进行构建的,因此您还需要针对同一前缀下的实际库进行链接(尽管您似乎只安装了一个静态库,但这可能不是您的意图;您可能需要正确地重新安装从源代码构建的OpenSSL )。
(编辑)要修复链接器找不到的dlopen()和好友,请在GCC命令行中添加-ldl。-ldl告诉链接器还链接到libdl.so,这是包含dlopen()、dlsym()、dlclose()等的共享库;这些函数由OpenSSL在内部使用,因此,当使用-lcrypto时,-ldl是一个间接依赖。由于您要链接到libcrypto的静态版本,因此需要显式链接所有间接依赖项。
如果您不熟悉链接到适当的库,我建议您使用从操作系统包管理器安装的OpenSSL;这可能会为您省去一些麻烦。
发布于 2014-05-28 13:38:14
这可能与那些试图从源代码构建自己的openssl,然后使用它来编译其他程序(在我的例子中是Git)的人相关
在配置openssl的过程中,添加'shared‘选项:
./config shared
这将创建所需的共享库libcrypto.so。您可以在安装文件中找到更多信息。
另外,如果你在'make‘过程中遇到这个错误
"....can not be used when making a shared object
使用-fPIC重新编译
./config shared -fPIC
https://stackoverflow.com/questions/10368671
复制相似问题