1

私はmongoose cサーバーの例を実行しようとしていますが、例をコンパイルしようとすると. 次のエラーが表示されます。これらの参照をヘッダーに含めた場合、これらの参照が欠落する可能性はありますか? Windows で mingw を使用してコンパイルしています。

gcc echo_server.c -out echo_server
echo_server.c:(.text+0x35): undefined reference to `mg_send'
echo_server.c:(.text+0x4a): undefined reference to `mbuf_remove'
echo_server.c:(.text+0x7f): undefined reference to `mg_mgr_init'
echo_server.c:(.text+0x9b): undefined reference to `mg_bind'
echo_server.c:(.text+0xb7): undefined reference to `mg_bind'
echo_server.c:(.text+0xe7): undefined reference to `mg_mgr_poll'

これは、echo_server.c です。

#include "mongoose.h"

static void ev_handler(struct mg_connection *nc, int ev, void *p) {
  struct mbuf *io = &nc->recv_mbuf;
  (void) p;

  switch (ev) {
    case MG_EV_RECV:
      mg_send(nc, io->buf, io->len);  // Echo message back
      mbuf_remove(io, io->len);        // Discard message from recv buffer
      break;
    default:
      break;
  }
}

int main(void) {
  struct mg_mgr mgr;
  const char *port1 = "1234", *port2 = "127.0.0.1:17000";

  mg_mgr_init(&mgr, NULL);
  mg_bind(&mgr, port1, ev_handler);
  mg_bind(&mgr, port2, ev_handler);

  printf("Starting echo mgr on ports %s, %s\n", port1, port2);
  for (;;) {
    mg_mgr_poll(&mgr, 1000);
  }
  mg_mgr_free(&mgr);

  return 0;
}
4

3 に答える 3

5

mongoose ライブラリともリンクする必要があります。フラグは( -lgcc で) リンクするライブラリを指定するために使用され、その後で直接名前を付けます。-lmongoose

完全なコマンド ライン コマンドは次のようになります。

gcc -lmongooose echo_server.c -out echo_server

編集:OPは、「mingwが見つからないと言う」ため、これは機能しなかったと述べました。

-Lまた、gcc がリンクしようとしているライブラリを見つけられるように、ライブラリ検索パス フラグを追加する必要がある場合もあります。使用方法は次のとおりです。

gcc -L C:\path\to\library -lmongoose echo_server.c -out echo_server

それでもOPの質問が解決しない場合、このページにはさらに情報があるかもしれません: http://www.mingw.org/wiki/HOWTO_Specify_the_Location_of_Libraries_for_use_with_MinGW

于 2016-03-13T14:01:40.557 に答える
1

この#includeディレクティブは、未定義の参照エラーを引き起こしたり、削除したりしません。これには、ライブラリのヘッダー#includeファイルが含まれているだけです。Cコンパイラがマングースライブラリの関数、データ型、および変数の宣言を認識するためには、ヘッダーファイルが必要です。

これらのシンボルの定義が見つからないため、代わりにリンカからのこれらのエラー。この場合、libmongoose;に対してリンクしていません。次のコマンド ラインを試してください。

gcc echo_server.c -o echo_server -lmongoose

またはmongoose、ライブラリとしてではなくソースにある場合は、

gcc -c mongoose.c
gcc echo_server.c mongoose.o -o echo_server

mongoose.o現在の作業ディレクトリにあります)。

于 2016-03-13T14:02:57.067 に答える