5

これは重複した投稿であると人々が結論に飛びつく前に、このトピックに関する他の投稿を調べましたが、実際には解決策が見つからなかったことを指摘したいと思います.


必要なもの

私の目標は、C プログラムから wpa_supplicant にアクセスして、次のことを行うことです。

  1. アクティブな接続を確認する
  2. インターフェースがいつダウンしたかを検出する
  3. AP への接続/AP のセットアップなど

わかったこと

  • wpa_supplicant と通信する C プログラムを作成する必要がある場合、DBus は必要ありません。
  • wpa_ctrl.hこれらのファイルをプロジェクト ディレクトリに含めるだけで、関数を利用できます。
  • この質問に関連して見つけたいくつかのリンクを次に示します。1、2、3 _ _ _ _
  • を使用した外部プログラムについて説明している公式ドキュメントも確認しましたwpa_ctrl.c

上記が実際に問題を解決しない理由

  • この問題に関してSOやその他の関連Webサイトで見つけた投稿のほとんどは、公式ドキュメントなどのリソースを指していますが、これは良いが問題を解決していません
  • これらの投稿の多くで、人々はこれを追求することをあきらめたか、解決策を考え出しましたが、オンラインに投稿していません.
  • このトピックの初心者には、wpa_supplicant の「hello world」という実際の例を投稿していただけると助かります。

これまでに行ったこと

  • このリンク から、ディレクトリにコピーwpa_supplicant-2.5/src/common/wpa_ctrl.h しまし た(多くの依存関係があるため)。次に、以下に示す同じディレクトリに簡単な C プログラムを作成しました。「wpa_ctrl_open」エラーへの未定義の参照が表示されますwpa_supplicant-2.5/src/utilscommon.hhostapd_cli.c

    #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: タイプミスを修正し、ビルド ログを追加しました

4

3 に答える 3

3

`wpa_ctrl_open' への未定義の参照

それはリンカのエラーです。コマンドの場合、

$ nm wpa_ctrl.o

wpa_ctrl_openが定義されていることが明らかになった場合、差し迫った問題はコマンドラインの順序にある​​可能性があります。試す:

gcc -o main hostapd_cli.o wpa_ctrl.o -lpthread

hostapd_cliの記号を参照しているためwpa_ctrl.oです。それ以外の場合は、そのシンボルを定義しているソース コードを見つけて、リンクできるようにする必要があります。

編集: 明らかに、いくつかのシンボルを定義する必要があります。

HTH。

于 2016-07-06T18:22:51.650 に答える