C 我能';t编译mongoose web服务器的代码';s示例

C 我能';t编译mongoose web服务器的代码';s示例,c,linux,mongoose-web-server,C,Linux,Mongoose Web Server,简短介绍:-(GCC版本4.6.3,操作系统Ubuntu 12.04,使用mongoose web服务器程序,因此当我运行“make”命令编译和安装mongoose时,它已经很好地完成了任务) [问题的第一部分] 这个问题与stackowerflow上的这篇文章有关 Valenok在这篇文章中给出了hello示例程序的链接 基本上,我正在尝试编译此链接中给出的示例hello程序代码:- 并将此代码放入已编译的mongoose目录中。(目录中有mongoose.h文件) 下面是我编译hello

简短介绍:-(GCC版本4.6.3,操作系统Ubuntu 12.04,使用mongoose web服务器程序,因此当我运行“make”命令编译和安装mongoose时,它已经很好地完成了任务)

[问题的第一部分] 这个问题与stackowerflow上的这篇文章有关

Valenok在这篇文章中给出了hello示例程序的链接

基本上,我正在尝试编译此链接中给出的示例hello程序代码:-

并将此代码放入已编译的mongoose目录中。(目录中有mongoose.h文件)

下面是我编译hello程序的命令行输出

akshay@akshay-Inspiron-N5010:~$ gcc mongoose/hello.c -o mongoose/hello
/tmp/ccroC5Z6.o: In function `callback':
hello.c:(.text+0x32): undefined reference to `mg_get_request_info'
hello.c:(.text+0x96): undefined reference to `mg_printf'
/tmp/ccroC5Z6.o: In function `main':
hello.c:(.text+0xee): undefined reference to `mg_start'
hello.c:(.text+0x103): undefined reference to `mg_stop'
collect2: ld returned 1 exit status
akshay@akshay-Inspiron-N5010:~$ 
[问题第二部分]

现在,我在mongoose.c文件中找到了mg_stop、mg_start、mg_printf和mg_get_request_info的实现,因此我使用-c选项编译mongoose.c文件,如下所示: gcc-c-o猫鼬.o猫鼬.c

我想我的问题类似于:-

但当我在gcc上使用-L选项链接libmongoose.so时,我会出现以下错误:- (libmongoose.so位于同一目录my cwd中)

此外,在不使用libmongoose.so进行编译时,仍会出现上述^^错误

[编辑]:在gcc上添加了-pthread选项,仍然显示错误:- mongoose.o:在函数
load_dll'中:
mongoose.c:(.text+0xa955):对
dlopen'的未定义引用 mongoose.c:(.text+0xa9b4):对“dlsym”的未定义引用 collect2:ld返回了1个退出状态

对于我问题的第1部分和第2部分:我希望消除这些错误并成功地运行hello.c程序示例。
提前感谢。

选项
-L
不用于链接库,而是用于指定动态库的搜索路径。要针对特定库进行链接,请使用
-l
。但是,您不需要同时针对
mongoose.o
libmongoose.o进行链接。因此
,任何一个都足够了

在Linux上,您还必须链接pthread和动态加载库,因为尽管它们是C标准库的一部分,但它们在
libc.so
中并不存在。需要注意的另一点是,binutils的最新版本(特别是
ld
)要求按照符号相互依赖的顺序指定库和对象文件,即。E库必须转到命令行的末尾

总之,请使用以下命令之一:

gcc -o hello hello.o mongoose.o -ldl -lpthread


-L
选项不用于链接库,而是用于指定动态库的搜索路径。要针对特定库进行链接,请使用
-l
。但是,您不需要同时针对
mongoose.o
libmongoose.o进行链接。因此
,任何一个都足够了

在Linux上,您还必须链接pthread和动态加载库,因为尽管它们是C标准库的一部分,但它们在
libc.so
中并不存在。需要注意的另一点是,binutils的最新版本(特别是
ld
)要求按照符号相互依赖的顺序指定库和对象文件,即。E库必须转到命令行的末尾

总之,请使用以下命令之一:

gcc -o hello hello.o mongoose.o -ldl -lpthread


@非常感谢!您提到的第一个命令可以正常工作。但对于第二个命令,在我运行它时发生了以下错误。/hello:-“加载共享库时出错:libmongoose.so:无法打开共享对象文件:没有这样的文件或目录”“@AkshayPatil是的,这就是它的工作原理。请仔细阅读动态加载。@H2CO3非常感谢!您提到的第一个命令可以正常工作。但对于第二个命令,在我运行它时发生了以下错误。/hello:-“加载共享库时出错:libmongoose.so:无法打开共享对象文件:没有这样的文件或目录”“@AkshayPatil是的,这就是它的工作原理。请阅读动态加载的相关内容。
gcc -L. -o hello hello.o -lmongoose -ldl -lpthread