在人们跳到结论说这是一个重复的帖子之前,我想指出我已经完成了关于这个主题的其他帖子,但实际上还没有找到解决方案。
我的目标是从C程序访问wpa_supplicant以执行以下操作:
wpa_ctrl.h
中的函数wpa_ctrl.c
从this链接,我将wpa_supplicant-2.5/src/common/wpa_ctrl.h
复制到wpa_supplicant-2.5/src/utils
目录中(因为common.h
有很多依赖项)。然后我在同一目录中编写了一个简单的C程序hostapd_cli.c
,如下所示。 我收到了对'wpa_ctrl_open'错误的未定义引用
#include "includes.h"
#include <dirent.h>
#include "wpa_ctrl.h"
#include "common.h"
static struct wpa_ctrl *ctrl_conn;
static int hostapd_cli_quit = 0;
static int hostapd_cli_attached = 0;
static const char *ctrl_iface_dir = "/var/run/wpa_supplicant";
static char *ctrl_ifname = NULL;
static int ping_interval = 5;
int main()
{
ctrl_conn = wpa_ctrl_open(ctrl_iface_dir);
if (!ctrl_conn){
printf("Could not get ctrl interface!\n");
return -1;
}
return 0;
}
C=gcc
CFLAGS=-lpthread
DEPS = includes.h wpa_ctrl.h common.h
OBJ = wpa_ctrl.o hostapd_cli.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
main: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm -f *.o *~ core $(INCDIR)/*~
gcc -o main wpa_ctrl.o hostapd_cli.o -lpthread
hostapd_cli.o: In function `main':
hostapd_cli.c:(.text+0xf): undefined reference to `wpa_ctrl_open'
collect2: error: ld returned 1 exit status
Makefile:10: recipe for target 'main' failed
make: *** [main] Error 1
没有太多关于如何使用这些文件并将其集成到外部项目或如何编译它的材料,我有点无能为力。任何有关如何进行的帮助将非常感激。
编辑1:更正了拼写错误并添加了构建日志
答案 0 :(得分:2)
好的,所以我可以在树莓派上使用它。一切归功于树莓派论坛上的Gyph(链接:https://www.raspberrypi.org/forums/viewtopic.php?t=42949)。
需要的文件
in wpa_supplicant/src/common :
wpa_ctrl.h
wpa_ctrl.c
in wpa_supplicant/src/utils :
build_config.h
common.h
includes.h
os.h
os_unix.c
wpabuf.h
wpa_debug.h
your own file
运行以下命令进行编译:
gcc -Wall -Wextra -I ./ -MMD -c -g -o wpa_ctrl.o wpa_ctrl.c -D CONFIG_CTRL_IFACE -D CONFIG_CTRL_IFACE_UNIX
gcc -Wall -Wextra -I ./ -MMD -c -g -o os_unix.o os_unix.c -D CONFIG_CTRL_IFACE -D CONFIG_CTRL_IFACE_UNIX
gcc -Wall -Wextra -o your_file your_file.c os_unix.o wpa_ctrol.o
要使用wpa_supplicant,我发现仅复制hostapd_cli并根据需要进行调整是最容易的。请注意,如果使用wpa_supplicant而不使用hostapd,则必须调整ctrl_iface_dir变量。 (对我来说是“ / var / run / wpa_supplicant”)。
答案 1 :(得分:1)
未定义对`wpa_ctrl_open&#39;
的引用
这是一个链接器错误。如果是命令,
$ nm wpa_ctrl.o
显示它定义了 wpa_ctrl_open ,那么您的直接问题可能只是命令行顺序。试试:
gcc -o main hostapd_cli.o wpa_ctrl.o -lpthread
因为hostapd_cli
引用wpa_ctrl.o
中的符号。否则,您需要找到定义该符号的源代码,以便链接到该符号。
修改:显然您需要define a couple of symbols。
HTH。