所以未定义的符号(在链接对象中定义)

时间:2014-09-04 14:20:28

标签: c++ linker development-environment

我构建的共享库存在问题。它基于wpa_cli并使用wpa_ctrl。 包含来自wpa_ctrl的符号,但是来自eloop - not:

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_

1 个答案:

答案 0 :(得分:4)

您需要以未拼写的形式公开该功能 - 它应该看起来像eloop_register_read_sock,而不是_Z24eloop_register_read_sockiPFviPvS_ES_S_

eloop.h代码没有c ++名称demangling guard,所以在你执行的C ++代码中:

#include <eloop.h>

你需要这样做:

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

这可以防止你以常规的错位形式结束。

wpa_supplicant库是基于C的库,因此,如果您计划引入C++代码,则必须在extern "C"的点上使用C++代码与.h.文件中公开的例程进行交互。