我编写了一个使用OpenSSL API的C ++ SSL Socket类。我正在使用的OpenSSL版本是“OpenSSL 1.0.0-fips”,如果这很重要的话。这个类属于我编写的共享库。
我正在尝试编写一个我的类的裸骨单元测试,但我无法分配SSL_CTX结构。
这是我的头文件:
#ifndef __TDLS_SSL_SOCKET_HPP__
#define __TDLS_SSL_SOCKET_HPP__
#include <stdexcept>
#include <openssl/ssl.h>
#include <openssl/x509v3.h>
#include <openssl/err.h>
class TdlsSSLSocket
{
public:
TdlsSSLSocket(const SSL_METHOD* method);
protected:
SSL_CTX* ctx;
};
#endif
以下是构造函数的实现:
#include "TdlsSSLSocket.hpp"
TdlsSSLSocket::TdlsSSLSocket(const SSL_METHOD* method)
{
ctx = SSL_CTX_new(method);
if(!ctx)
{
throw std::runtime_error("Failed to initialize SSL CTX object");
}
}
以下是我编译此源代码的方法:
g++ -fPIC -g -O2 -Wall -c -o TdlsSSLSocket.o TdlsSSLSocket.cpp
ld -r TdlsTCPSocket.o TdlsTCPClient.o TdlsTCPServer.o ReferenceCounter.o TdlsSSLSocket.o -o socket.o
以下是我创建共享库的方法:
g++ -shared -Wl,-soname,libttshared.so.2 -lssl -o libttshared.so.2.0 logger/log.o conf/conf_objs.o seq/seq.o socket/socket.o
这是我尝试练习课程的C ++单元测试。
#include <iostream>
#include "TdlsSSLSocket.hpp"
using namespace std;
int main(int argc, char* argv[])
{
SSL_library_init();
SSL_load_error_strings();
TdlsSSLSocket ssl_server(TLSv1_method());
}
我建造它就像这样:
g++ -o TestSSLServer TestSSLServer.o ../../libttshared.so -L../.. -lttshared
当我执行单元测试时,我收到以下错误:
[tlytle@vraptor3 test]$ TestSSLServer
TestSSLServer: symbol lookup error: TestSSLServer: undefined symbol: _ZN13TdlsSSLSocketC1EPK13ssl_method_st
奇怪的未定义符号_ZN13TdlsSSLSocketC1EPK13ssl_method_st
几乎看起来像C ++名称错误可能是罪魁祸首。但是,我尝试在extern "C"
中包装该类,但我得到了同样的错误。
有什么建议吗?
答案 0 :(得分:0)
对于阅读此内容的任何人来说,问题不在于OpenSSL库。未定义的符号问题意味着链接器无法解析给定的符号。我在单元测试二进制文件TestSSLServer上执行了ldd
,它显示我没有链接到当前版本的libttshared.so
。我设置了LD_LIBRARY_PATH变量,以包含新共享库的目录和成功执行的程序。