即使包含 mongoose.h 也未定义引用
Undefined reference even with mongoose.h included
我正在尝试 运行 猫鼬 C 服务器示例,但是当我尝试编译这些示例时。我收到以下错误。如果我将它们包含在 header 中,这些引用怎么会丢失?我正在 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;
}
您还需要确保 link 使用 mongoose 库。 -l
标志用于(与 gcc 一起)指定要使用 link 的库,然后直接给出名称:-lmongoose
完整的命令行命令为:
gcc -lmongooose echo_server.c -out echo_server
编辑:OP 说这不起作用,因为 "mingw say it can not find it."
您可能还需要添加库搜索路径标志 -L
以帮助 gcc 找到您尝试 link 的库。用法如下:
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
#include
指令既不会导致也不会删除未定义的引用错误; #include
仅包含库的 header 文件; 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
)。
查看此文档here
您可以使用
简单地编译您的代码
cc my_app.c mongoose.c
简单!
如果你的主程序是 C++
然后使用 c++
c++ main.cpp monoose.c
我不知道你使用的 OS 和编译器,但它在 ubuntu 中使用基本的 gcc 和 g++ 编译器对我有用。
我正在尝试 运行 猫鼬 C 服务器示例,但是当我尝试编译这些示例时。我收到以下错误。如果我将它们包含在 header 中,这些引用怎么会丢失?我正在 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;
}
您还需要确保 link 使用 mongoose 库。 -l
标志用于(与 gcc 一起)指定要使用 link 的库,然后直接给出名称:-lmongoose
完整的命令行命令为:
gcc -lmongooose echo_server.c -out echo_server
编辑:OP 说这不起作用,因为 "mingw say it can not find it."
您可能还需要添加库搜索路径标志 -L
以帮助 gcc 找到您尝试 link 的库。用法如下:
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
#include
指令既不会导致也不会删除未定义的引用错误; #include
仅包含库的 header 文件; 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
)。
查看此文档here
您可以使用
简单地编译您的代码cc my_app.c mongoose.c
简单!
如果你的主程序是 C++ 然后使用 c++
c++ main.cpp monoose.c
我不知道你使用的 OS 和编译器,但它在 ubuntu 中使用基本的 gcc 和 g++ 编译器对我有用。