我正在开发Red Hat Enterprise Linux Server 7.0版(Maipo)。服务器提供OpenSSL 1.0.1。尝试链接到OpenSSL时,我收到了很多加密错误。
这是我的链接命令命令行(在命令行中的顺序):
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
以下是一些错误:
/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中链接,但在7以上的redhat中失败。 有什么建议 ?
答案 0 :(得分:0)
COMP_zlib
和EVP_get_cipherbyname
等函数是OPenSSL SSL库的一部分,而不是Crypto库的一部分。您有-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_lib2.so private_lib3.so -lssl -lcrypto
。
同样libssh
必须继续-lssl -lcrypto
。我不知道它的链接在哪里,但图书馆可能会以不同的名字出现。最后,您可能会发现使用库列表<other libs> ... -lssl -lcrypto -llzma -pthread
更容易。
它也可能是OpenSSL的新版本或不同版本,但配置不同。例如,看起来Red Hat会删除压缩(./configure no-comp ...
),但标题会引入COMP_zlib
之类的符号。
我猜您的下一步是:(1)显示典型的编译命令,(2)提供g++ -v
,以便我们可以看到标题搜索路径。
最后要记住的是,您使用的是g++
,因此默认情况下与extern "C++"
建立关联。它可能是其中一个旧的OpenSSL标头缺乏惯例:
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
我无法访问Red Hat服务器,所以我不确定。我使用CentOS和Fedora测试另一个库,但我知道有时存在差异。