C++ 未定义符号-混淆

C++ 未定义符号-混淆,c++,c,ubuntu,linker-errors,C++,C,Ubuntu,Linker Errors,在Ubuntu 10.04 LTS上: /usr/bin/g++ -> g++-4.4 /usr/bin/gcc -> gcc-4.4 我正在Ubuntu中编写一个基于openssl库(libssl.a和libssl.so)的libssl_ext库 我打字的时候 $nm -C -defined-only -g libssl_ext.so 我可以看到以下定义的符号 00005140 D SSLv3_enc_data_Ext **00002800 T SSLv3_server_met

在Ubuntu 10.04 LTS上:

/usr/bin/g++ -> g++-4.4
/usr/bin/gcc -> gcc-4.4
我正在Ubuntu中编写一个基于openssl库(libssl.a和libssl.so)的libssl_ext库 我打字的时候

$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
....
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
.....
当我打字时:

$nm -C -defined-only -g libssl.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
....
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_方法时,会有不同 对于server.o,它显示为“U SSLv3_server_method”,并且可以成功链接到libssl.so。 但是当我将libssl_Ext.so中的SSLv3_server_method_Ext与server.o链接时,它显示为“U SSLv3_server_method_Ext() 由于未定义对SSLv3_服务器_方法_Ext()的引用而失败


如果有人向我解释为什么server.o在寻找SSLv3\u server\u method\u Ext()而不是SSLv3\u server\u method\u Ext,请告诉我,以及如何解决这个问题?当我调用libssl.so时,链接器正确地查找了SSLv3_server_方法,找到了它。

您可能需要显示链接命令行。您是否正在链接
-lssl_ext
(可能在
-lssl
之前列出)?您是否在目标文件之后列出了库?您是如何编译的?您是如何创建库的?我猜:当您构建
libssl
时,您正在创建
libssl
链接到
libssl\u ext
。可能头需要是
extern“C”
?(我认为,如果在它们的头文件中,这将被视为openssl中的一个bug)Server.cpp需要有extern“C”来包含“openssl/ssl_ext.h”头文件。然后它成功链接。谢谢你的建议!您可能需要显示链接命令行。您是否正在链接
-lssl_ext
(可能在
-lssl
之前列出)?您是否在目标文件之后列出了库?您是如何编译的?您是如何创建库的?我猜:当您构建
libssl
时,您正在创建
libssl
链接到
libssl\u ext
。可能头需要是
extern“C”
?(我认为,如果在它们的头文件中,这将被视为openssl中的一个bug)Server.cpp需要有extern“C”来包含“openssl/ssl_ext.h”头文件。然后它成功链接。谢谢你的建议!