Matthew Note

用C++进行 Apache Module 开发

为什么要用C++

很多时候我们可以不必使用C++,很多时候linux开发只要用C就可以了,但是在对于一些大型应用程序,他本身就是由C++编写,而Apache Module又只能默认使用C,所以不能够用apxs来编译module,只能够通过g++,但是这里就需要一点要的技巧来搞定它。

Why

因为Apache是通过dlopen()/dlsym()来加载module的,但是这两个函数不能够很好的处理C++的命名方式,所以如果用g++来编译so文件,就会出现不能够找到module的情况。

Solution

所以我们要强制它以C语言的方式来编译,在module的声明前加上extern 或者extern “C”

1
extern module AP_MODULE_DECLARE_DATA soap_module;

或者

1
extern “C” module AP_MODULE_DECLARE_DATA soap_module;

更进一步的,可以使用如下定义:

1
2
3
4
5
6
7
8
9
10
11
12
#ifdef __cplusplus
extern "C" {
#endif
//TO-DO
#ifdef __cplusplus
}
#endif
~~~
再通过g++来编译
~~~
g++ -fPIC -shared -o mod_soap.so mod_soap.c test.o -I/usr/include/apr-1.0 -I/usr/include/openssl -I/usr/include/xmltok -pthread -I/usr/include/apache2 -I/usr/include/apr-1.0 -I/usr/include/apr-1.0 -I/usr/include/httpd -std=c++0x

就可以得到正确的module了,下面就可以使用apxs来安装module

1
sudo apxs2 -i mod_soap.so