Openssl 对“COMP”的未定义引用_zlib@libcrypto.so.10';(及其他)
我正在开发Red Hat Enterprise Linux Server 7.0版(Maipo)。服务器提供OpenSSL 1.0.1。我在尝试链接到OpenSSL时遇到了很多加密错误 这是我的链接命令行(命令行中的顺序): 以下是一些错误:Openssl 对“COMP”的未定义引用_zlib@libcrypto.so.10';(及其他),openssl,redhat,Openssl,Redhat,我正在开发Red Hat Enterprise Linux Server 7.0版(Maipo)。服务器提供OpenSSL 1.0.1。我在尝试链接到OpenSSL时遇到了很多加密错误 这是我的链接命令行(命令行中的顺序): 以下是一些错误: /lib64/libssl.so.10: undefined reference to `COMP_zlib@libcrypto.so.10' /lib64/libssh2.so.1: undefined reference to `EVP_get_cip
/lib64/libssl.so.10: undefined reference to `COMP_zlib@libcrypto.so.10'
/lib64/libssh2.so.1: undefined reference to `EVP_get_cipherbyname@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `X509_STORE_free@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `BIO_clear_flags@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `d2i_KRB5_AUTHENT@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `MD5_Transform@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `X509_VERIFY_PARAM_set_depth@libcrypto.so.10'
/lib64/libssh2.so.1: undefined reference to `DSA_do_verify@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `SHA384_Init@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `PEM_ASN1_read_bio@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `FIPS_mode@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `OBJ_find_sigid_algs@libcrypto.so.10'
/lib64/libssh2.so.1: undefined reference to `BN_bn2bin@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `EVP_rc2_40_cbc@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `sk_num@libcrypto.so.10'
...
当我跑步时:
ll /usr/lib64/libcrypto.so
我越来越
/usr/lib64/libcrypto.so -> libcrypto.so.1.0.1e
运行时:
objdump -tT /usr/lib64/libcrypto.so.1.0.1e | grep COMP_zlib
我明白了
000000000013e500 g DF .text 0000000000000002 libcrypto.so.10 COMP_zlib_cleanup
000000000013e460 g DF .text 000000000000009e libcrypto.so.10 COMP_zlib
这意味着我把它放在这个图书馆里。
最奇怪的是,它能够在redhat 6.5/4中链接,但在redhat高于7时失败。
有什么建议吗 函数,如
COMP_zlib
和EVP_get_cipherbyname
是OPenSSL SSL库的一部分,而不是加密库。您有-lcrypto
,但似乎缺少-lssl
:
g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \
-lcrypto private_lib2.so private_lib3.so -llib3
您应该更改为-lssl-lcrypto
:
g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \
-lssl -lcrypto private_lib2.so private_lib3.so -llib3
如果private_lib2.so private_lib3.so
依赖于OpenSSL,则需要在它们之后移动-lssl-lcrypto
。也就是说,使用private\u lib2.so private\u lib3.so-lssl-lcrypto
而且libssh
必须继续-lssl-lcrypto
。我看不出它被链接到了哪里,但是这个库的名字可能不同。最后,您可能会发现使用库列表-lssl-lcrypto-llzma-pthread
它也可能是OpenSSL的更新版本或不同版本,但其配置不同。例如,它看起来像是Red Hat删除了压缩(/configure no comp…
),但标头引入了类似comp\u zlib
的符号
我想你的下一步是:(1)显示一个典型的编译命令,(2)提供g++-v
,这样我们就可以看到标题搜索路径
最后要记住的一件事是,您使用的是g++
,因此默认情况下与beextern“C++”
链接。它可能是缺少惯用的OpenSSL标头之一:
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
我没有访问Red Hat服务器的权限,所以我不确定。我使用CentOS和Fedora测试了另一个库,但我知道有时会存在差异。
COMP_zlib
和EVP_get_cipherbyname
等函数是OPenSSL库的一部分,而不是加密库。您有-lcrypto
,但似乎缺少-lssl
:
g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \
-lcrypto private_lib2.so private_lib3.so -llib3
您应该更改为-lssl-lcrypto
:
g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \
-lssl -lcrypto private_lib2.so private_lib3.so -llib3
如果private_lib2.so private_lib3.so
依赖于OpenSSL,则需要在它们之后移动-lssl-lcrypto
。也就是说,使用private\u lib2.so private\u lib3.so-lssl-lcrypto
而且libssh
必须继续-lssl-lcrypto
。我看不出它被链接到了哪里,但是这个库的名字可能不同。最后,您可能会发现使用库列表-lssl-lcrypto-llzma-pthread
它也可能是OpenSSL的更新版本或不同版本,但其配置不同。例如,它看起来像是Red Hat删除了压缩(/configure no comp…
),但标头引入了类似comp\u zlib
的符号
我想你的下一步是:(1)显示一个典型的编译命令,(2)提供g++-v
,这样我们就可以看到标题搜索路径
最后要记住的一件事是,您使用的是g++
,因此默认情况下与beextern“C++”
链接。它可能是缺少惯用的OpenSSL标头之一:
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
我没有访问Red Hat服务器的权限,所以我不确定。我使用CentOS和Fedora测试了另一个库,但我知道有时会存在差异。问题还不清楚,可能有很多潜在原因。我们甚至不知道您正在尝试链接什么,或者正在使用哪些工具的版本,以及如何使用它们(例如CLI args),等等。也许您忘记链接到libcrypto了?在链接到libssl的标志之后添加
-lcrypto
链接标志。或者,您可能正试图链接在与Red Hat 7.0不兼容的机器上编译的某个不兼容的库。无论如何,详细描述您的问题是一个好主意,例如,向我们展示您运行的生成此输出的实际命令。我正在链接crypto lib(添加了命令行)。我认为这与Redhat7有关。因为它能够在redhat 6.5/4上编译。问题还不清楚,可能有很多潜在原因。我们甚至不知道您正在尝试链接什么,或者正在使用哪些工具的版本,以及如何使用它们(例如CLI args),等等。也许您忘记链接到libcrypto了?在链接到libssl的标志之后添加-lcrypto
链接标志。或者,您可能正试图链接在与Red Hat 7.0不兼容的机器上编译的某个不兼容的库。无论如何,详细描述您的问题是一个好主意,例如,向我们展示您运行的生成此输出的实际命令。我正在链接crypto lib(添加了命令行)。我认为这与Redhat7有关。因为它可以在redhat 6.5/4上编译。