使用c++/c++11开发nginx模块时的两种编译方法

使用c++开发nginx模块时的两种编译方法
Nginx本身只支持使用C语言开发模块,如果我们需要使用C++,那么必须修改源码里的编译脚本
首先,我们不能使用g++编译Nginx自身的C代码,因为C++的语法比C严格很多,而Nginx代码用到了很多C语言的“边角”特性,直接使用g++编译会报大量错误
正确的做法是使用gcc来编译nginx源码,而使用g++来编译我们自己的C++代码,两者可使用文件扩展名区分(*.c和*.cpp),最后使用g++链接所有的目标文件,如果使用其他第三方库
(如boost),可以在configure时用--with-ld-opt参数,
在运行configure时,会调用auto/make这个脚本来生成Makeile, 此Makefile决定了源码的编译链接方式  

方法一:修改auto/make脚本

1、链接器LINK改用g++
2、增加C++编译器和编译选项,启用C++11标准
3、生成编译命令时用扩展名区分C源码和C++源码

具体做法(此处nginx版本为1.10.1):

#LINK =  $LINK    					#26行,注释掉原链接器
CXX = g++							#新增C++编译器
CXXFLAGS = -std=c++0x -Wall			#新增C++编译选项,启用C++11,此处可以添加更多参数
LINK = g++							#新增C++链接器


修改# the addons sources(406行)下的代码

if test -n "$NGX_ADDON_SRCS"; then
 
    ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch ddons sources\$(ALL_INCS)"
#定义c++编译命令
	ngx_cxx="\$(CXX) $ngx_compile_opt \$(CXXFLAGS) $ngx_use_pch ddons sources\$(ALL_INCS)"
	
	for ngx_src in $NGX_ADDON_SRCS
    do
		...
	ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`
	#获取源码文件后缀,决定使用gcc还是g++
	ext=`echo ${ngx_src} | cut -d . -f 2`
	ngx_gcc=$ngx_cc
	if [ $ext = "cpp" ]; then	
		ngx_gcc=$ngc_cxx
	fi
	
	cat << END                                            >> $NGX_MAKEFILE
 
 $ngx_obj:       \$(ADDON_DEPS)$ngx_cont$ngx_src
        #$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
		$ngx_gcc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
 
 END
      done
此处使用cut来获取文件扩展名,如果使用bash,可以更方便地获取扩展名:
ext = ·echo ${ngx_src:(-4)}·     #bash支持直接获取末尾字符串

方法二:直接修改Makefile文件


对nginx源码运行configure后,在obj目录下生成Makefile文件

CC =    cc
CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -DNGX_HTTP_HEADERS -g
后面添加
CXX =    g++
CXXFLAGS =  -pipe  -O -W -Wall -std=c++11 -Wpointer-arith -Wno-unused-parameter -Werror 
修改
#LINK =  $(CC)
LINK =  $(CXX)
对于每个.cpp文件,手动修改编译方式

修改

objs/addon/snpixel/pixel_module.o:      $(ADDON_DEPS) \
         /home/lijinqi/project/code/snpixel/snpixel/pixel_module.cpp
         #$(CC) -c $(CFLAGS)  $(ALL_INCS) \
		 $(CXX) -c $(CXXFLAGS)  $(ALL_INCS) 
                 -o objs/addon/snpixel/pixel_module.o \
                 /home/lijinqi/project/code/snpixel/snpixel/pixel_module.cpp

另外,在引用nginx源码时,需要加上extern“C”

如:

extern "C" {
    #include 
    #include 
    #include 
}






你可能感兴趣的:(Apache/Nginx)