最近项目开发要使用libmicrohttpd作为WebAPI开发框,本篇记录libmicrohttpd在Ubuntu平台下开发环境的搭建。
开发平台:Ubuntu 1804
前期准备:
下载libmicrohttpd源码
https://gnu.mirror.constant.com/libmicrohttpd/
参考文档
https://www.gnu.org/software/libmicrohttpd/#documentation
编译步骤:
1.切换到libmicrohttpd源码目录。
scott@ubuntu1804:~$ cd /media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1
scott@ubuntu1804:/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1$
2.创建Makefile文件
scott@ubuntu1804:/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1$ ./configure
scott@ubuntu1804:/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1$ ./configure
省略输出
..........
configure: GNU libmicrohttpd 1.0.1 Configuration Summary:
Target directory: /usr/local
Cross-compiling: no
Operating System: Linux
Threading lib: posix
Inter-thread comm: eventfd
Shutdown of listening socket triggers select: yes
poll support: yes
epoll support: yes
sendfile used: yes, Linux-style
HTTPS support: no (lacking libgnutls)
Messages: yes
Cookie parsing: yes
Postproc: yes
Basic auth.: yes
Digest auth.: yes
Digest auth. defaults: timeout: 90 seconds (default), max nc: 1000 (default)
MD5: yes, built-in
SHA-256: yes, built-in
SHA-512/256: yes, built-in
HTTP "Upgrade": yes
Compact code: no (by default)
Use thread names: yes
Use debug asserts: no
Use sanitizers: no
Build static lib: yes
Build shared lib: yes
Build docs: yes
Build examples: yes
Build tools: yes
Test with libcurl: no, many unit tests will not run
Heavy tests: no
Fuzzing tests: no, heavy tests are not enabled
configure:
License : LGPLv2.1+ or eCos
scott@ubuntu1804:/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1$
3.编译生成库
scott@ubuntu1804:/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1$ make
scott@ubuntu1804:/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1$ make
省略部分输出
..........
libtool: link: gcc -fno-strict-aliasing -g -O2 -o .libs/basicauthentication basicauthentication.o ../../src/microhttpd/.libs/libmicrohttpd.so -pthread
depbase=`echo simplepost.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
gcc -DHAVE_CONFIG_H -I. -I../.. -I../../src/include -DNDEBUG=1 -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -fno-strict-aliasing -g -O2 -MT simplepost.o -MD -MP -MF $depbase.Tpo -c -o simplepost.o simplepost.c &&\
mv -f $depbase.Tpo $depbase.Po
/bin/bash ../../libtool --tag=CC --mode=link gcc -fno-strict-aliasing -g -O2 -o simplepost simplepost.o ../../src/microhttpd/libmicrohttpd.la
libtool: link: gcc -fno-strict-aliasing -g -O2 -o .libs/simplepost simplepost.o ../../src/microhttpd/.libs/libmicrohttpd.so -pthread
depbase=`echo largepost.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
gcc -DHAVE_CONFIG_H -I. -I../.. -I../../src/include -DNDEBUG=1 -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -fno-strict-aliasing -g -O2 -MT largepost.o -MD -MP -MF $depbase.Tpo -c -o largepost.o largepost.c &&\
mv -f $depbase.Tpo $depbase.Po
/bin/bash ../../libtool --tag=CC --mode=link gcc -fno-strict-aliasing -g -O2 -o largepost largepost.o ../../src/microhttpd/libmicrohttpd.la
libtool: link: gcc -fno-strict-aliasing -g -O2 -o .libs/largepost largepost.o ../../src/microhttpd/.libs/libmicrohttpd.so -pthread
depbase=`echo sessions.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
gcc -DHAVE_CONFIG_H -I. -I../.. -I../../src/include -DNDEBUG=1 -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -fno-strict-aliasing -g -O2 -MT sessions.o -MD -MP -MF $depbase.Tpo -c -o sessions.o sessions.c &&\
mv -f $depbase.Tpo $depbase.Po
/bin/bash ../../libtool --tag=CC --mode=link gcc -fno-strict-aliasing -g -O2 -o sessions sessions.o ../../src/microhttpd/libmicrohttpd.la
libtool: link: gcc -fno-strict-aliasing -g -O2 -o .libs/sessions sessions.o ../../src/microhttpd/.libs/libmicrohttpd.so -pthread
make[4]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/examples'
make[3]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/examples'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc'
make[1]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1'
scott@ubuntu1804:/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1$
4.安装库,默认安装到/usr/local目录下
scott@ubuntu1804:/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1$ sudo make install
Making install in contrib
make[1]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/contrib'
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/contrib'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/contrib'
make[1]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/contrib'
Making install in m4
make[1]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/m4'
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/m4'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/m4'
make[1]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/m4'
Making install in src
make[1]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src'
Making install in include
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/include'
Making install in .
make[3]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/include'
make[4]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/include'
make[4]: Nothing to be done for 'install-exec-am'.
/bin/mkdir -p '/usr/local/include'
/usr/bin/install -c -m 644 microhttpd.h '/usr/local/include'
make[4]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/include'
make[3]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/include'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/include'
Making install in microhttpd
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/microhttpd'
make[3]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/microhttpd'
/bin/mkdir -p '/usr/local/lib'
/bin/bash ../../libtool --mode=install /usr/bin/install -c libmicrohttpd.la '/usr/local/lib'
libtool: install: /usr/bin/install -c .libs/libmicrohttpd.so.12.62.1 /usr/local/lib/libmicrohttpd.so.12.62.1
libtool: install: (cd /usr/local/lib && { cp -pR -f libmicrohttpd.so.12.62.1 libmicrohttpd.so.12 || { rm -f libmicrohttpd.so.12 && cp -pR libmicrohttpd.so.12.62.1 libmicrohttpd.so.12; }; })
libtool: install: (cd /usr/local/lib && { cp -pR -f libmicrohttpd.so.12.62.1 libmicrohttpd.so || { rm -f libmicrohttpd.so && cp -pR libmicrohttpd.so.12.62.1 libmicrohttpd.so; }; })
libtool: install: /usr/bin/install -c .libs/libmicrohttpd.lai /usr/local/lib/libmicrohttpd.la
libtool: install: /usr/bin/install -c .libs/libmicrohttpd.a /usr/local/lib/libmicrohttpd.a
libtool: install: chmod 644 /usr/local/lib/libmicrohttpd.a
libtool: install: ranlib /usr/local/lib/libmicrohttpd.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/local/lib
/sbin/ldconfig.real: /usr/local/lib/libmicrohttpd.so.12 is not a symbolic link
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/microhttpd'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/microhttpd'
Making install in .
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src'
make[3]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src'
Making install in examples
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/examples'
Making install in .
make[3]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/examples'
make[4]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/examples'
make[4]: Nothing to be done for 'install-exec-am'.
make[4]: Nothing to be done for 'install-data-am'.
make[4]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/examples'
make[3]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/examples'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/examples'
Making install in tools
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/tools'
Making install in .
make[3]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/tools'
make[4]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/tools'
make[4]: Nothing to be done for 'install-exec-am'.
make[4]: Nothing to be done for 'install-data-am'.
make[4]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/tools'
make[3]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/tools'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src/tools'
make[1]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/src'
Making install in .
make[1]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1'
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1'
make[2]: Nothing to be done for 'install-exec-am'.
/bin/mkdir -p '/usr/local/lib/pkgconfig'
/usr/bin/install -c -m 644 libmicrohttpd.pc '/usr/local/lib/pkgconfig'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1'
make[1]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1'
Making install in doc
make[1]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc'
Making install in .
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc'
make[3]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc'
make[3]: Nothing to be done for 'install-exec-am'.
/bin/mkdir -p '/usr/local/share/info'
/usr/bin/install -c -m 644 libmicrohttpd_performance_data.png '/usr/local/share/info'
/bin/mkdir -p '/usr/local/share/info'
/usr/bin/install -c -m 644 ./libmicrohttpd.info ./libmicrohttpd-tutorial.info '/usr/local/share/info'
install-info --info-dir='/usr/local/share/info' '/usr/local/share/info/libmicrohttpd.info'
install-info --info-dir='/usr/local/share/info' '/usr/local/share/info/libmicrohttpd-tutorial.info'
/bin/mkdir -p '/usr/local/share/man/man3'
/usr/bin/install -c -m 644 libmicrohttpd.3 '/usr/local/share/man/man3'
make[3]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc'
Making install in doxygen
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/doxygen'
make[3]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/doxygen'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/doxygen'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/doxygen'
Making install in examples
make[2]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/examples'
Making install in .
make[3]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/examples'
make[4]: Entering directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/examples'
make[4]: Nothing to be done for 'install-exec-am'.
make[4]: Nothing to be done for 'install-data-am'.
make[4]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/examples'
make[3]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/examples'
make[2]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc/examples'
make[1]: Leaving directory '/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1/doc'
scott@ubuntu1804:/media/sf_ubuntuShare/vod_system/soure/libmicrohttpd-1.0.1$
安装路径
头文件路径 /usr/local/include
库目录 /usr/local/lib
其他信息文件
5.设置环境变量
- 设置
PKG_CONFIG_PATH
环境变量:执行以下命令将/usr/local/lib/pkgconfig
添加到PKG_CONFIG_PATH
环境变量中
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
6.编写测试代码测试
#include <microhttpd.h> // 引入Libmicrohttpd库
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#define PORT 8888
// 处理每个连接请求的函数
static int answer_to_connection (void *cls, struct MHD_Connection *connection,
const char *url, const char *method,
const char *version, const char *upload_data,
size_t *upload_data_size, void **con_cls) {
char *page; // 存储生成的HTML页面内容
FILE *fp; // 文件指针,用于执行命令
char path[1035]; // 存储命令输出的缓冲区
// 执行系统命令ls
fp = popen("ls -alh ~/projects/", "r");
if (fp == NULL) {
printf("Failed to run command\n");
exit(1);
}
// 动态分配空间来存储HTML页面内容
size_t page_size = 10000;
page = malloc(page_size);
if (!page) {
perror("Malloc failed");
exit(1);
}
strcpy(page, "<html><head><meta charset=\"UTF-8\"></head><body>");
// 读取命令输出并添加到HTML页面
while (fgets(path, sizeof(path)-1, fp) != NULL) {
// 检查是否需要扩展缓冲区
if (strlen(page) + strlen(path) + 8 > page_size) {
page_size *= 2; // 加倍页面大小
char *new_page = realloc(page, page_size);
if (!new_page) {
perror("Realloc failed");
free(page);
exit(1);
}
page = new_page;
}
strcat(page, path);
strcat(page, "<br>");
}
strcat(page, "</body></html>");
struct MHD_Response *response;
int ret;
// 创建响应对象,其中包含生成的HTML页面
response = MHD_create_response_from_buffer(strlen(page), (void *)page, MHD_RESPMEM_MUST_FREE);
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response(response);
pclose(fp);
return ret;
}
int main () {
struct MHD_Daemon *daemon; // 定义服务器守护进程
// 启动守护进程,监听指定端口
daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, PORT, NULL, NULL,
(MHD_AccessHandlerCallback) answer_to_connection, NULL, MHD_OPTION_END);
if (NULL == daemon) return 1; // 如果守护进程启动失败,返回1
getchar(); // 等待用户输入以退出
MHD_stop_daemon(daemon); // 停止守护进程
return 0;
}
编译:
scott@ubuntu1804:~/projects$ gcc -o command command_example.c -lmicrohttpd
后面一定要添加链接库
7.启动服务
scott@ubuntu1804:~/projects$ ./command
打开浏览器测试 输入ip:端口号
这个结果与Ubuntu的ls命令查看一样的结果:
到此,libmicrohttpd的开发环境搭建完成。
参考: