2014-09-04 41 views
1

我有一个共享库的问题,我构建。它基于wpa_cli并使用wpa_ctrl。从wpa_ctrl 符号都包括在内,但是从ELOOP - 不是:所以未定义的符号(在链接对象中定义)

g++ -Wall -g -fPIC -DPIC -fno-rtti -fno-exceptions -pthread -g -fno-exceptions -pthread -DPIC -fPIC -shared libwlan.o wpa_supplicant-2.2/src/common/wpa_ctrl.o wpa_supplicant-2.2/src/utils/eloop.o wpa_supplicant-2.2/src/utils/wpa_debug.o wpa_supplicant-2.2/src/utils/common.o wpa_supplicant-2.2/src/utils/os_unix.o wpa_supplicant-2.2/src/utils/edit_simple.o -o libwlan.so 

nm wpa_supplicant-2.2/src/common/wpa_ctrl.o | grep wpa_ctrl_attach 
00000578 T wpa_ctrl_attach 
nm libs/libwlan/libwlan.so | grep wpa_ctrl_attach 
00040340 T wpa_ctrl_attach 

nm wpa_supplicant-2.2/src/utils/eloop.o | grep eloop_register_read_sock 
000003bc T eloop_register_read_sock 
nm libs/libwlan/libwlan.so | grep eloop_register_read_sock 
000407dc T eloop_register_read_sock 
     U _Z24eloop_register_read_sockiPFviPvS_ES_S_ 

回答

4

你需要公开的功能未重整形式 - 它应该看起来像eloop_register_read_sock,而不是_Z24eloop_register_read_sockiPFviPvS_ES_S_

eloop.h代码没有C++的名字demangling后卫,所以在你的C++代码中执行:

#include <eloop.h> 

你需要做的:

extern "C" { 
#include <eloop.h> 
} 

这应该防止您结束了与例程的破坏形式。

wpa_supplicant提供库是基于C库,所以如果你在介绍C++码规划,你将不得不对点使用extern "C"其中C++代码在.h.文件暴露的程序进行交互。

+0

宾果!非常感谢你 :) – 2014-09-04 15:44:33