ld:OpenSSL(libssl)找不到的符号

时间:2010-06-03 05:12:42

标签: c++ openssl

我正在尝试在我的Mac上构建TorTunnel。我已经成功安装了Boost库及其开发文件。 TorTunnel还需要OpenSSL及其开发文件。

我已将它们安装在/usr/lib/libssl.dylib和/ usr / include / openssl /.

当我运行make命令时,这是我得到的错误:

g++ -ggdb -g -O2 -lssl -lboost_system-xgcc42-mt-1_38  -o torproxy TorProxy.o HybridEncryption.o Connection.o Cell.o Directory.o ServerListing.o Util.o Circuit.o CellEncrypter.o RelayCellDispatcher.o CellConsumer.o ProxyShuffler.o CreateCell.o CreatedCell.o TorTunnel.o SocksConnection.o Network.o  
Undefined symbols:
  "_BN_hex2bn", referenced from:
      Circuit::initializeDhParameters()      in Circuit.o
  "_BN_free", referenced from:
      Circuit::~Circuit()in Circuit.o
      Circuit::~Circuit()in Circuit.o
      CreatedCell::getKeyMaterial(unsigned char**, unsigned char**)in CreatedCell.o
  "_DH_generate_key", referenced from:
      Circuit::initializeDhParameters()      in Circuit.o
  "_PEM_read_bio_RSAPublicKey", referenced from:
      ServerListing::getOnionKey()       in ServerListing.o
  "_BIO_s_mem", referenced from:
      Connection::initializeSSL()       in Connection.o
      Connection::initializeSSL()       in Connection.o
  "_DH_free", referenced from:
      Circuit::~Circuit()in Circuit.o
  "_BIO_ctrl_pending", referenced from:
      Connection::writeFromBuffer(boost::function)in Connection.o
  "_RSA_size", referenced from:
      HybridEncryption::encryptInSingleChunk(unsigned char*, int, unsigned char**, int*, rsa_st*)in HybridEncryption.o
      HybridEncryption::encryptInHybridChunk(unsigned char*, int, unsigned char**, int*, rsa_st*)in HybridEncryption.o
      HybridEncryption::encrypt(unsigned char*, int, unsigned char**, int*, rsa_st*)in HybridEncryption.o
  "_RSA_public_encrypt", referenced from:
      HybridEncryption::encryptInSingleChunk(unsigned char*, int, unsigned char**, int*, rsa_st*)in HybridEncryption.o
      HybridEncryption::encryptInHybridChunk(unsigned char*, int, unsigned char**, int*, rsa_st*)in HybridEncryption.o
  "_BN_num_bits", referenced from:
      CreateCell::CreateCell(unsigned short, dh_st*, rsa_st*)in CreateCell.o
      CreatedCell::getKeyMaterial(unsigned char**, unsigned char**)in CreatedCell.o
      CreatedCell::getKeyMaterial(unsigned char**, unsigned char**)in CreatedCell.o
      CreatedCell::isValid()      in CreatedCell.o
  "_SHA1", referenced from:
      CellEncrypter::expandKeyMaterial(unsigned char*, int, unsigned char*, int)in CellEncrypter.o
  "_BN_bn2bin", referenced from:
      CreateCell::CreateCell(unsigned short, dh_st*, rsa_st*)in CreateCell.o
  "_BN_bin2bn", referenced from:
      CreatedCell::getKeyMaterial(unsigned char**, unsigned char**)in CreatedCell.o
  "_DH_compute_key", referenced from:
      CreatedCell::getKeyMaterial(unsigned char**, unsigned char**)in CreatedCell.o
  "_BIO_new", referenced from:
      Connection::initializeSSL()       in Connection.o
      Connection::initializeSSL()       in Connection.o
  "_BIO_new_mem_buf", referenced from:
      ServerListing::getOnionKey()       in ServerListing.o
  "_AES_ctr128_encrypt", referenced from:
      HybridEncryption::AES_encrypt(unsigned char*, int, unsigned char*, unsigned char*, int)in HybridEncryption.o
      CellEncrypter::aesOperate(Cell&, aes_key_st*, unsigned char*, unsigned char*, unsigned int*)in CellEncrypter.o
  "_BIO_read", referenced from:
      Connection::writeFromBuffer(boost::function)in Connection.o
  "_SHA1_Update", referenced from:
      CellEncrypter::calculateDigest(SHAstate_st*, RelayCell&, unsigned char*)in CellEncrypter.o
      CellEncrypter::initKeyMaterial(unsigned char*)in CellEncrypter.o
      CellEncrypter::initKeyMaterial(unsigned char*)in CellEncrypter.o
  "_SHA1_Final", referenced from:
      CellEncrypter::calculateDigest(SHAstate_st*, RelayCell&, unsigned char*)in CellEncrypter.o
  "_DH_size", referenced from:
      CreatedCell::getKeyMaterial(unsigned char**, unsigned char**)in CreatedCell.o
  "_DH_new", referenced from:
      Circuit::initializeDhParameters()      in Circuit.o
  "_BIO_write", referenced from:
      Connection::readIntoBufferComplete(boost::function, boost::system::error_code const&, unsigned long)in Connection.o
  "_RSA_free", referenced from:
      Circuit::~Circuit()in Circuit.o
  "_BN_dup", referenced from:
      Circuit::initializeDhParameters()      in Circuit.o
      Circuit::initializeDhParameters()      in Circuit.o
  "_BN_new", referenced from:
      Circuit::initializeDhParameters()      in Circuit.o
      Circuit::initializeDhParameters()      in Circuit.o
  "_SHA1_Init", referenced from:
      CellEncrypter::CellEncrypter()in CellEncrypter.o
      CellEncrypter::CellEncrypter()in CellEncrypter.o
  "_RAND_bytes", referenced from:
      HybridEncryption::encryptInHybridChunk(unsigned char*, int, unsigned char**, int*, rsa_st*)in HybridEncryption.o
      Util::getRandomId()      in Util.o
  "_AES_set_encrypt_key", referenced from:
      HybridEncryption::AES_encrypt(unsigned char*, int, unsigned char*, unsigned char*, int)in HybridEncryption.o
      CellEncrypter::initKeyMaterial(unsigned char*)in CellEncrypter.o
      CellEncrypter::initKeyMaterial(unsigned char*)in CellEncrypter.o
  "_BN_set_word", referenced from:
      Circuit::initializeDhParameters()      in Circuit.o
  "_RSA_new", referenced from:
      ServerListing::getOnionKey()       in ServerListing.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [torproxy] Error 1

我知道如何解决它?

3 个答案:

答案 0 :(得分:4)

您还需要libcrypto。

将您的链接更改为:

g++ -ggdb -g -O2 -lssl -lcrypt ... as before ...

答案 1 :(得分:1)

至少缺少的符号不是libssl的一部分,而是libcrypto的一部分:

diciu:~ diciu$ nm /usr/lib/libcrypto.dylib | grep PEM_read_bio_RSAPublicKey
00031d20 T _PEM_read_bio_RSAPublicKey

将“-lcrypto”添加到编译行。

答案 2 :(得分:1)

如果libcrypto已安装在/ opt / local / lib中,请将-lcrypt标志更改为-lcrypto标志。

 g++ -ggdb -g -O2 -L/opt/local/lib -L/usr/lib -lssl -lcrypto -lboost_system-mt