Ubuntu平台下libmicrohttpd编译

最近项目开发要使用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的开发环境搭建完成。

参考:

CentOS7 云服务器上安装 Libmicrohttpd 库 - 路有所思 - 博客园

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值