Nginx使用纯C语言开发,默认使用GCC编译,如何使用C++开发Nginx模块或者在开发的Nginx模块中引入C++库呢?

首先介绍下C和C++混合编程的背景知识。

我们知道C++ 是在 C 语言的基础上发展起来的。在某种程度上,我们可将 C++ 看做 C 的一种扩展。在本质上,二者的数据类型和函数调用惯例都是一致的, C 与 C++ 混合编译也是很自然的事情。

二者的区别仅在于编译后函数的名字不同──C 简单地使用函数名而不考虑参数的个数或类型,而 C++ 编译后的函数名则总是将参数类型列表作为其一部分。尽管如此,C++ 提供了特殊的机制来声明 C 函数,这意味着一个 C++ 程序可以直接声明和调用 C 函数。

C++调用C函数

C++调用C实现的函数func_implement_by_c时,在C++代码里的函数声明必须用extern “C” 前缀:

/*

* file name: cpp_caller.cpp

*/

extern "C" void func_implement_by_c(char *str);

void cpp_caller()

{

func_implement_by_c("I'm from CPP");

}

int main()

{

cpp_caller();

}

C调用C++函数

C如果要调用C++的代码,特别是要调用类的成员函数,一般需要把C++函数封装成C样式的函数:

/**

* file name: c_wapper_of_member_func.cpp

*/

void c_wapper_of_member_func(char *str)

{

class TestClass;

TestClass a;

a.member_func(str);

}

在C中调用时,也是需要在函数声明前加extern “C”前缀:

/**

* file name: c_caller.c

*/

extern "C" void c_wrapper_of_member_func(char *str);

void c_caller()

{

c_wrapper_of_member_func("I'm from C");

}

int main()

{

c_caller();

}

下面我们理一下Nginx C++模块相关解决方案的设计思路。

首先,不要试图用C++编译器(如G++)来编译Nginx的官方代码,这会带来大量的不可控错误。正确的做法是仍然用C编译器来编译Nginx官方提供的各模块,而用C++编译器来编译用C++语言开发的模块,并打包成静态库。然后利用C和C++混合编程的思路,将C++写成的模块封装成C样式的接口来和Nginx的其他模块进行交互。

1. C++模块使用Nginx的头文件,需要使用extern “C” 包起来

#ifdef __cplusplus

extern "C" {

#endif

#include

#include

#include

#include

#ifdef __cplusplus

}

#endif

2. 将C++模块封装成C样式的接口,将模块注册到Nginx中

3. 修改C++模块的配置文件(模块目录下的config文件),实现最终的编译

在CORE_INCS中条件增加头文件路径,在CORE_LIBS中增加库文件的路径,并增加”-lstdc++”链接选项:

比如,我们用C++实现的Nginx模块代码最终打包成静态库libcpp_module.a,则配置文件修改如下:

ngx_feature="http_push_stream_module"

ngx_feature_name=

ngx_feature_run=no

ngx_feature_incs=

ngx_feature_path=

ngx_feature_libs=

ngx_feature_test=

CPP_MODULE_DIR="/data/packages/nginx-push-stream-module/cpp-module"

ngx_addon_name=ngx_http_push_stream_module

HTTP_MODULES="$HTTP_MODULES ngx_http_push_stream_module"

CORE_INCS="$CORE_INCS \

$ngx_addon_dir/src \

$ngx_addon_dir/include \

$CPP_MODULE_DIR"

CORE_LIBS="$CORE_LIBS -L$CPP_MODULE_DIR -lstdc++ -lcpp_module"

NGX_ADDON_SRCS="$NGX_ADDON_SRCS \

${ngx_addon_dir}/src/ngx_http_push_stream_module.c"

have=NGX_HTTP_HEADERS . auto/have

. auto/feature

#if not have sha1 or do not want to use WebSocket comment the lines bellow

USE_SHA1=YES

have=NGX_HAVE_SHA1 . auto/have

nginx模块开发 c语言,Nginx模块开发 – C++模块相关推荐

  1. 游戏开发- Python语言在游戏开发中的潜力

    PYTHON 是一种面向对象的通用高级编程语言,由 GUIDO VAN ROSSUM 于 1991 年开发.自发展以来,PYTHON 已成为世界上最流行的编程语言之一.它经常在流行度调查中排名靠前-- ...

  2. 【nginx+lua高性能web应用开发(二):开发评论模块(ssi+mysql)】

    开发这个模块,是为了解决项目中的实际问题,思考设计的 . 本文原文连接: http://blog.csdn.NET/freewebsys/article/details/16944917 转载请注明出 ...

  3. Linux环境,手把手带你实现一个Nginx模块,深入了解Nginx丨惊群效应|error|负载均衡|Openresty丨C/C++Linux服务器开发丨中间件

    Linux环境,手把手带你实现一个Nginx模块,深入了解Nginx 视频讲解如下,点击观看: Linux环境,手把手带你实现一个Nginx模块,深入了解Nginx丨惊群效应|error|负载均衡|O ...

  4. 【Linux后台开发系列】Nginx源码从模块开发开始,不再对nginx源码陌生丨源码分析

    Nginx源码从模块开发开始,不再对nginx源码发怵,值得学习,认真听完. 1.  nginx的conf配置,cmd解析 2.  nginx模块的八股文 3.  nginx开发的细枝末节 [Linu ...

  5. c语言口令验证模块加强版,[C语言学习第3章口令验证模块的开发.ppt

    [C语言学习第3章口令验证模块的开发 C语言程序 设计项目教程 第3章 口令验证模块的开发 Evaluation only. Created with Aspose.Slides for .NET 3 ...

  6. openresty开发系列36--openresty执行流程之6日志模块处理阶段

    openresty开发系列36--openresty执行流程之6日志模块处理阶段 一)header_filter_by_lua 语法:header_filter_by_lua <lua-scri ...

  7. nginx向响应内容中追加内容(ngx_http_addition_module模块)

    为什么80%的码农都做不了架构师?>>>    ngx_http_addition_module在响应之前或者之后追加文本内容,比如想在站点底部追加一个js或者css,可以使用这个模 ...

  8. Linux服务器开发环境搭建 Nginx+PHP+MongoDB

     Linux服务器开发环境搭建 Nginx+PHP+MongoDB mkdir -p /home/trlinux/download mkdir -p /home/trlinux/server mkdi ...

  9. 海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理)

    海思开发板FFmpeg+Nginx推流RTSP播放(优秀教程收集+实操整理) 安装FFmpeg及移植 FFmpeg编译问题收录: static declaration of 'cbrt' follow ...

  10. python3.6 asyncio paramiko_Python开发【第六篇】:模块

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

最新文章

  1. 跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?(源码感悟)
  2. EZBioCloud:16S和原核基因组物种注释和新种鉴定
  3. php ajax工作原理,AJAX实现页面无刷新操作原理解析
  4. asp.net mvc jquery ajax post,使用ASP.NET MVC在JS文件中设置jQuery的ajax url
  5. Oracle常用sql操作总结
  6. 如何在Ubuntu 18.04上创建多节点MySQL集群
  7. 如何显示python的内置模块_Python 如何查看Python自带的模块 - 弟球嗑学
  8. GCC为什么不将a * a * a * a * a * a优化为(a * a * a)*(a * a * a)?
  9. Android 简单登陆 涉及 Button CheckBox TextView EditText简单应用
  10. xencenter如何安装Centos7虚拟机系统
  11. Linux安装docker-ce教程 centos依赖包安装
  12. 测井解释-泥岩-煤层-砂岩-石灰岩-白云岩-硬石膏-岩盐-水
  13. 漫谈软件架构设计系列(一):可用性设计
  14. t分布em参数估计matlab,参数估计的MATLAB实现.ppt
  15. 阿里云弹性计算ECS科普
  16. win7桌面计算机图标去掉,win7桌面图标小箭头怎么去掉?
  17. 【自然语言处理】一篇文章入门分词(Tokenization)
  18. Java 算法:带权图Weighted Graph
  19. JOB SERVER 负载均衡
  20. OJ刷题---鸡兔同笼问题

热门文章

  1. LeetCode之同构字符串
  2. 江湖传闻怪谈——让酒
  3. Macbook Pro 使用小记
  4. ImageJ-计算创面面积 此博文包含图片 (2014-01-28 15:59:14)
  5. 【ArcGIS操作】1 基础编辑篇
  6. 爬虫实战(一)之爬取房天下新房数据
  7. 光山二高2021高考成绩查询,光山县第二高级中学2019高考成绩和历年成绩汇总
  8. 算法案例之有效字母异位词
  9. 文件存储形式的通讯录
  10. 设计模式-01-设计模式简介及分类