未定义的符号 - 困惑

时间:2012-10-07 01:37:58

标签: c++ c ubuntu linker-errors

在Ubuntu 10.04上LTS:

/usr/bin/g++ -> g++-4.4
/usr/bin/gcc -> gcc-4.4

我在Ubuntu中编写一个libssl_ext库,它基于openssl库(libssl.a和libssl.so) 当我输入

$nm -C -defined-only -g libssl_ext.so

我可以看到以下符号定义

00005140 D SSLv3_enc_data_Ext
**00002800 T SSLv3_server_method_Ext**
00005174 A __bss_start
00005174 A _edata
0000517c A _end
00003aa8 T _fini
00001954 T _init
00002d70 T ssl3_accept_Ext
00002480 T ssl3_enc_Ext
00002850 T ssl3_get_client_key_exchange_Ext
000026f0 T ssl3_write_Ext
00002320 T ssl3_write_bytes_Ext

当我输入:

$nm -C -defined-only -g libssl.so

我可以看到以下符号定义

....
00018930 T SSLv3_client_method
00050600 D SSLv3_enc_data
00013640 T SSLv3_method
**00013690 T SSLv3_server_method**
00026f40 T TLSv1_client_method
000506c0 D TLSv1_enc_data
00026ea0 T TLSv1_method
00026ef0 T TLSv1_server_method
.....

当我在server.cpp代码中调用SSLv3_server_method_Ext时,它有一个问题:

server.cpp:70: undefined reference to SSLv3_server_method_Ext()

当我输入:

$ nm -C --undefined-only -g server.o 

它显示以下内容:

U CRYPTO_free
U ERR_print_errors_fp
U SSL_CIPHER_get_name
U SSL_CTX_ctrl
U SSL_CTX_free
U SSL_CTX_new
U SSL_CTX_set_cipher_list
U SSL_accept
U SSL_free
U SSL_get_current_cipher
U SSL_get_error
U SSL_get_peer_certificate
U SSL_get_version
U SSL_library_init
U SSL_new
U SSL_read
U SSL_set_fd
U SSL_shutdown
U SSL_write
**U SSLv3_server_method**
U X509_NAME_oneline
U X509_free
**U SSLv3_server_method_Ext()**
U __gxx_personality_v0
U accept
U bind
U close
U exit
U htons
U inet_ntoa
U listen
U memset
U perror
U printf
U puts
U socket
U stderr

从libssl.so链接 SSLv3_server_method时有所不同 使用server.o ,它显示为“U SSLv3_server_method”,并且可以与libssl.so成功链接。 但是,当我将libssl_ext.so中的 SSLv3_server_method_Ext与server.o 相关联时,它显示为“U SSLv3_server_method_Ext()” 并且未定义引用SSLv3_server_method_Ext()

如果有人向我解释为什么server.o正在寻找SSLv3_server_method_Ext()而不是SSLv3_server_method_Ext 以及如何解决此问题?当我调用libssl.so并找到它时,链接器正在寻找SSLv3_server_method。

0 个答案:

没有答案