Неопределенная ссылка даже с включенным mongoose.h

Я пытаюсь запустить примеры сервера mongoose c, но когда я пытаюсь скомпилировать примеры. Я получаю следующую ошибку. Как эта ссылка может отсутствовать, если я включу ее в заголовок? Я компилирую под окнами с помощью 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;
}

person Learning C    schedule 13.03.2016    source источник


Ответы (3)


Вам также необходимо установить связь с библиотекой mongoose. Флаг -l используется (с gcc) для указания библиотеки для компоновки, затем сразу после этого вы указываете имя: -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

На этой странице может быть дополнительная информация, если это все еще не решило вопрос ОП: http://www.mingw.org/wiki/HOWTO_Specify_the_Location_of_Libraries_for_use_with_MinGW

person jdek    schedule 13.03.2016
comment
Вам также может понадобиться ссылка на ws2_32.lib, если вы используете Windows - person jdek; 13.03.2016

Директива #include не вызывает и не устраняет ошибки неопределенных ссылок; #include включает только файлы заголовков для библиотеки; файлы заголовков необходимы для того, чтобы компилятор C знал объявление функций, типов данных и переменных в библиотеке mongoose.

Эти ошибки возникают из-за компоновщика, потому что он не находит определения для этих символов. В этом случае вы не связываетесь с 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 в текущем рабочем каталоге).

person Antti Haapala    schedule 13.03.2016
comment
Я пробовал эту команду с -lmongoose, но mingw говорит, что не может ее найти. - person Learning C; 13.03.2016

Ознакомьтесь с этим документом здесь

Вы можете просто скомпилировать свой код с помощью

cc my_app.c mongoose.c

Легкий!

И если ваша основная программа написана на С++, используйте С++

c++ main.cpp monoose.c

Я не знаю, какую ОС и компилятор вы используете, но у меня он работает в Ubuntu с базовым компилятором gcc и g++.

person Rishav Bhowmik    schedule 12.10.2020