Недефинирана препратка дори с включен mongoose.h

Опитвам се да стартирам примерите за 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;
}

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

Тази страница може да има малко повече информация, ако това все още не е разрешило въпроса на OP: 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++, тогава използвайте c++

c++ main.cpp monoose.c

Не знам операционната система и компилатора, които използвате, но ми работят в ubuntu с основен компилатор gcc & g++.

person Rishav Bhowmik    schedule 12.10.2020