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

Bar*_*iak 2 c++ linker development-environment

我构建的共享库有问题。它基于 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
Run Code Online (Sandbox Code Playgroud)

.

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
Run Code Online (Sandbox Code Playgroud)

.

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_
Run Code Online (Sandbox Code Playgroud)

Pet*_*esh 5

您需要以未损坏的形式公开该函数 - 它应该看起来像eloop_register_read_sock,而不是_Z24eloop_register_read_sockiPFviPvS_ES_S_

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

#include <eloop.h>
Run Code Online (Sandbox Code Playgroud)

你需要做:

extern "C" {
#include <eloop.h>
}
Run Code Online (Sandbox Code Playgroud)

这应该可以防止您以例程的错误形式结束。

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