4102|0

888

帖子

3

TA的资源

五彩晶圆(初级)

楼主
 

用C++编写nginx模块 [复制链接]

1 编译方式的修改
Nginx的configure脚本没有对C++语言编译模块提供支持,因此,修改编译方式就有以下两种思路:
1)修改configure相关的脚本。
2)修改configure执行完毕后生成的Makefile文件。
我们推荐使用第2种方法,因为Nginx的一个优点是具备大量的第三方模块,这些模块都是基于官方的configure脚本而写的,擅自修改configure脚本会导致我们的Nginx无法使用第三方模块。
修改Makefile其实是很简单的。首先我们根据3.3.2节介绍的方式来执行configure脚本,之后会生成objs/Makefile文件,此时只需要修改这个文件的3处即可实现C++模块。这里还是以mytest模块为例,代码如下。

CC =   gcc
CXX = g++  
CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Werror -g  
CPP =   gcc -E  
LINK =  $(CXX)  

…  
objs/addon/httpmodule/ngx_http_mytest_module.o: $(ADDON_DEPS) \  
        ../sample/httpmodule/ngx_http_mytest_module.c  
        $(CXX) -c $(CFLAGS)  $(ALL_INCS) \  
                -o objs/addon/httpmodule/ngx_http_mytest_module.o \  
                ../sample/httpmodule/ngx_http_mytest_module.cpp  

下面解释一下上述代码中修改的地方。
在Makefile文件首部新增了一行CXX = g++,即添加了C++编译器。
把链接方式LINK =  $(CC)改为了LINK =  $(CXX),表示用C++编译器做最后的链接。
把模块的编译方式修改为C++编译器。如果我们只有一个C++源文件,则只要修改一处,但如果有多个C++源文件,则每个地方都需要修改。修改方式是把$(CC)改为$(CXX)。
这样,编译方式即修改完毕。修改源文件后不要轻易执行configure脚本,否则会覆盖已经修改过的Makefile。建议将修改过的Makefile文件进行备份,避免每次执行configure后重新修改Makefile。
注意 确保在操作系统上已经安装了C++编译器。请参照1.3.2节中的方式安装gcc-c++编译器

2 程序中的符号转换
C语言与C++语言最大的不同在于编译后的符号有差别(C++为了支持多种面向对象特性,如重载、类等,编译后的方法名与C语言完全不同),这可以通过C++语言提供的extern “C” {}来实现符号的互相识别。也就是说,在C++语言开发的模块中,include包含的Nginx官方头文件都需要使用extern “C”括起来。例如:
extern "C" {  
    #include
    #include
    #include
}
这样就可以正常地调用Nginx的各种方法了。
另外,对于希望Nginx框架回调的类似于ngx_http_mytest_handler这样的方法也需要放在extern “C”中。

点赞 关注
个人签名邮箱:ternence.hsu@foxmail.com
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表