Не могу понять, как создать приложение C после добавления Mongoose Embedded

Я довольно новичок в разработке C, и особенно в make-файлах, поэтому, пожалуйста, потерпите меня. У меня есть функциональное приложение на C, которое красиво собирается (на основе этого проекта) с его Makefile, но я хочу, чтобы оно отвечало на запросы http. Таким образом, мангуст.

Функционально Makefile вызывает:

g++ -pthread -I./ -I../../dmx/include -I/usr/include/glib-2.0 -I/usr/include/gtk-3.0 -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/atk-1.0  -g -c DMXController.c -o DMXController.o -Wno-deprecated-declarations
g++ -o DMXController.bin DMXController.o -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -lusb -lm -L../../dmx/lib -ldmx -L. -ldl -lpthread  -Wl,--no-whole-archive -rdynamic
rm DMXController.o 

Это прекрасно работает без каких-либо вызовов функций Mongoose, но прерывается, как только я добавляю один из них. Я скопировал файлы mongoose.c и mongoose.h в непосредственный родительский каталог и добавил #include "mongoose.h", но я не совсем уверен, как добавить зависимости в Makefile.

Документация Mongoose гласит, что нужно строить, используя форму cc app.c mongoose.c -pthread -o app, но как мне совместить это с тем, что у меня уже есть?

Если я запускаю свой существующий Makefile в коде приложения с помощью вызовов функций mongoose, ошибка компиляции будет такой: undefined reference to 'mg_create_server' (или любая другая функция мангусты, которую я могу использовать).

Соответствующие части кода приложения приведены ниже.

#include <gtk/gtk.h>                        // GTK+3.0 graphics library
#include <dmx.h>                            // DMX interface library
#include "mongoose.h"                       // Mongoose Web server

// ...

int main( int argc, char *argv[] )
{
    // initialize mg
    struct mg_server *server = mg_create_server(NULL, NULL); // undefined reference
    mg_set_option(server, "document_root", ".");      // undefined reference
    mg_set_option(server, "listening_port", "8080");  // undefined reference

    // initialize DMX
    int error;
    error = initDMX(); // local function that works fine
    if ( error < 0 ) return ( error );

    // do stuff 
    for (;;) {
            mg_poll_server(server, 1000);   // undefined reference
    }

    // kill mg
    mg_destroy_server(&server); // undefined reference

    // kill DMX
    exitDMX(); // local function that works fine

    // die quietly
    return ( 0 );
}

Содержимое Makefile: (в настоящее время... я пробовал разные вещи)

CC=g++
CFLAGS+=  -pthread

LDFLAGS+= -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 \
      -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo \
      -lgobject-2.0 -lglib-2.0 -lusb -lm \
      -L../../dmx/lib -ldmx -L.# -lmongoose -ldl -lpthread

INCLUDES+= -I. -I../../dmx/include \
       -I/usr/include/glib-2.0 -I/usr/include/gtk-3.0 \
       -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include \
       -I/usr/include/pango-1.0 -I/usr/include/cairo \
       -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 \
       -I/usr/include/atk-1.0

OBJS=DMXController.o
BIN=DMXController.bin

all: $(BIN)

%.o: %.c
    @rm -f $@
    $(CC) $(CFLAGS) $(INCLUDES) -g -c $< -o $@ -Wno-deprecated-declarations

%.bin: $(OBJS)
    $(CC) -o $@ $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic
    @cp $@ ../bin

clean:
    for i in $(OBJS); do (if test -e "$$i"; then ( rm $$i ); fi ); done
    @rm -f $(BIN)

Спасибо за помощь!

1 ответ

Решение

Простое решение - добавить в ваш Makefile:

LDFLAGS+=../mongoose.c

Это соберет мангуст и свяжет его с вашим приложением

Другие вопросы по тегам