当前位置: 首页 > news >正文

nginx c++模块编译

不论是c还是c++,nginx的第三方模块编写没什么太区别,但是提供给nginx调用的,必须是纯c的接口。
先说下为什么不能使用c++编译nginx,nginx是纯c写的,而且c++是兼容c的,但是用c++(g++)编译nginx的框架,就会出一大堆的错误。是nginx的问题吗,那肯定不是,主要就是c和c++语法的严格问题。举个例子

main()
{
   fun() ;
}

fun()
{
}
这样的代码使用c编译是没问题的,但是使用c++编译就会报错,c的语法没那么严格。而nginx中很多这样的风格代码,因此使用c++编译不了nginx。

因此可以使用c编译nginx,c++编译我们自己的模块代码,最后使用c++进行链接,将全部的.o文件链接即可。
下面就说过程方法
主要有2种方法,1是改写make,2是改写Makefile
前者是一劳永逸的方法。
后者只要重新执行了configure就的重新去手动修改Makefile,当然也可以写个自动化shell脚本来代替手动修改。

所以先说方法二
跟nginx对接的地方,和c版一样,只不过代码中关于nginx需要用的c部分还是的使用c的编译方式
extern "C"{
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h> 
static ngx_int_t ngx_http_mymodulecpp_handler(ngx_http_request_t *r);
static char * ngx_http_mymodulecpp(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
}
这部分是给nginx调用的,所以需要用C括起来。然后至于函数的实现就完全是可以c++了,我们自己的其他代码都完全是c++编写都行。
同样的在config中,源码文件也改为*.cpp等
同样的还是先执行auto/configure --add-module=src/mytest
然后修改objs/Makefile
1.文件前面新增编译器CXX=g++ , 编译参数 CXXFLAGS=-std=c++11 -g -Wall
2.将LINK改为 LINK=$(CXX),表示用g++进行链接。
3.文件后面找到ADDON,就是我们自己的模块编译的地方,将$(CC)改为我们的$(CXX)  $(CFLAGS)改为
$(CXXFLAGS)即可。这样我们的模块就使用g++,而且使用c++11的方式编译了,最后使用g++进行链接。

make进行编译,
make install 安装

最终运行nginx进行测试。
只能g++进行链接,因为我们的模块是g++编译的,其他是c编译的,c编译无法链接g++生成的.o(obj)文件,后面兼容前面嘛。


下面 再说下一劳永逸的c++编译方法:就是修改nginx的编译脚本
打开auto/make,在文件前面
1.添加c++编译器 CXX=g++
2.添加c++的编译参数 CXXFLAGS=-std=c++11 -g -Wall等
3.将里面的 LINK改为 LINK=g++ (LINK默认是gcc,这里改为c++的)
4.找到里面的第三方模块编译地方(可以搜索 the addons source),将ngx_cc后面的CC改为CXX,CFLAGS改为CXXFLAGS。
此方法在后续的过程中,可以全量编译,最终都是第三方模块按c++编译,最后使用c++链接。所有的第三方模块都是按c++编译了,如果其中的某些模块需要按c编译,那么在 the addons source 处的for循环中做.c和.cpp判断,或者文件名的判断特殊处理。

 

相关文章:

  • 【JS重点知识05】正则表达式
  • java基础练习题
  • Web前端与REST API:深度解析与实战指南
  • vue antdesgin table 动态表头动态数据示例
  • [AIGC] SpringBoot的自动配置解析
  • Faiss assertion ‘err == cudaSuccess‘ failed in void faiss::gpu:runL2Norm()
  • STM32/keil把多个c文件编译为静态库lib
  • C++的算法:拓扑排序的原理及应用
  • WWDC 2024前瞻:苹果如何用AI技术重塑iOS 18和Siri
  • VMware ESXi 8.0U2c macOS Unlocker OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版
  • dp+矩阵快速幂,CF551D. GukiZ and Binary Operations
  • 【数据分析基础】实验一 Python运算符、内置函数、序列基本用法
  • 什么时候用C而不用C++?
  • mysql当前状态分析(show status)
  • 吃星星(1.5)
  • 【RocksDB】TransactionDB源码分析
  • 【知识碎片】第三方登录弹窗效果
  • 2017年终总结、随想
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Python打包系统简单入门
  • Selenium实战教程系列(二)---元素定位
  • 大型网站性能监测、分析与优化常见问题QA
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 模型微调
  • 微信小程序--------语音识别(前端自己也能玩)
  • scrapy中间件源码分析及常用中间件大全
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # Panda3d 碰撞检测系统介绍
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (145)光线追踪距离场柔和阴影
  • (26)4.7 字符函数和字符串函数
  • (7) cmake 编译C++程序(二)
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)丶RabbitMQ的六大核心
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (南京观海微电子)——示波器使用介绍
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (四) Graphivz 颜色选择
  • (四)软件性能测试
  • (算法)前K大的和
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .bat批处理出现中文乱码的情况
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .Net Core与存储过程(一)
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET Remoting学习笔记(三)信道
  • .NET 依赖注入和配置系统
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET简谈设计模式之(单件模式)