Can';我不知道在添加Mongoose Embedded之后如何构建C应用程序
我对C开发相当陌生,尤其是makefiles,所以请耐心听我说。我有一个功能强大的C应用程序,它可以很好地使用Makefile构建,但我希望它能够响应http请求。因此,猫鼬 在功能上,Makefile调用:Can';我不知道在添加Mongoose Embedded之后如何构建C应用程序,c,makefile,mongoose-web-server,C,Makefile,Mongoose Web Server,我对C开发相当陌生,尤其是makefiles,所以请耐心听我说。我有一个功能强大的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/inclu
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
的形式构建,但是如何将其与我已经拥有的结合起来呢
如果使用mongoose函数调用在应用程序代码上运行现有Makefile,编译错误为:未定义对“mg_create_server”(或我可能使用的任何其他mongoose函数)的引用
下面是应用程序代码的相关部分
#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 );
}
#包括//GTK+3.0图形库
#包括//DMX接口库
#包括“mongoose.h”//mongoose Web服务器
// ...
int main(int argc,char*argv[])
{
//初始化mg
struct mg_server*server=mg_create_server(NULL,NULL);//未定义的引用
mg_set_选项(服务器,“document_root”,“);//未定义的引用
mg_设置_选项(服务器,“侦听_端口”,“8080”);//未定义的引用
//初始化DMX
整数误差;
error=initDMX();//工作正常的本地函数
如果(错误<0)返回(错误);
//做事
对于(;;){
mg_poll_server(server,1000);//未定义的引用
}
//杀镁
mg_destroy_server(&server);//未定义的引用
//杀死DMX
exitDMX();//工作正常的本地函数
//静静地死去
返回(0);
}
Makefile的内容:(目前…我一直在尝试各种方法)
CC=g++
CFLAGS+=-pthread
LDFLAGS+=-lgtk-3-lgdk-3-latk-1.0-lgio-2.0-LPANGOCARO-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
包括+=-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
全部:$(BIN)
%.o:%.c
@rm-f$@
$(CC)$(CFLAGS)$(包括)-g-c$<-o$@-Wno不推荐的声明
%.bin:$(OBJS)
$(CC)-o$@$(OBJS)$(LDFLAGS)-Wl,--没有整个归档文件-rdynamic
@cp$@../bin
清洁:
对于i,单位为美元(OBJS);do(如果测试-e“$$i”;那么(rm$$i);fi);完成
@rm-f$(银行标识代码)
谢谢你的帮助 一个简单的解决方案是添加到Makefile中:
LDFLAGS+=../mongoose.c
这将构建mongoose并将其与应用程序链接起来这看起来有点奇怪:-L.-ldl-lpthread表示下一个库(libdl.so和libpthread.so)将在当前目录中找到。这看起来有点奇怪:-I./-I.././dmx/include通常本地目录列为-I。并且您无法确保dmx目录始终位于当前目录之上的2个目录。所以使用绝对路径。两个关键问题:1)mongoose.h文件位于哪里?2) 关联的库位于何处?这些问题的答案将告诉您makefilenote中需要更改的内容:-I和-L必须始终以目录名结尾。(.和..)是相对目录名,因此-I.适用于当前目录for-l(小写“l”)。如果库位于标准位置,则不需要前面的'-l'参数,否则必须使用包含库路径的前面的'-l'参数。酷。这很有效。但是为了学习机会,为什么它会起作用呢?这面旗子实际上是做什么的?我似乎找不到关于基本标志(-c-L-L等)的有用参考。-c构建一个对象文件,-L链接一个库,-L给出搜索库的路径。如果您想将mongoose与-lmongoose一起使用,您应该构建这个库,例如使用ar
LDFLAGS+=../mongoose.c