三、常见问题
1、常见错误
apxs:Error: Sorry, cannot determine bootstrap symbol name. apxs:Error: Please specify one with option `-n'.
加个-n参数,给模块起个名字
apxs2 -iacn mod_helloworld.cpp ./mod_helloworld.so
2、带库模块的编译
a、库编译仍然采用gcc或g++,结果为libfun.so(示例),比如:
标准C:gcc -shared fun.cpp -o libfun.so
C++:g++ -shared fun.cpp -o libfun.so
带MYSQL: g++ -shared student.cpp fun.cpp -I/usr/include/mysql/ -lmysqlclient -lm -o libfun.so
合并C++:g++ -shared fun1.cpp fun2.cpp -o libfun.so
b、编译APACHE c模块文件方法如下:
apxs2 -ica -L./ -lfun test.c -Wl,-rpath=/root/
如果是C++文件,添加-S CC=g++参数。-WL,-rpath=/root/表示APACHE运行时需加载libfun.so的放置目录。
该设置可以通过ldd test.so查看,结果如下:
root@ubuntu:~# ldd test.so
linux-gate.so.1 => (0x00a32000)
libfun.so => /root/libfun.so (0x0018e000)
如果编译时需包含MYSQL,只需确认MYSQl.h的头文件位置,然后添加-I/usr/include/mysql/编译选项。示例如:
apxs2 -c -L./ -I/usr/include/mysql/ -lmysqlclient -lfun test.c -Wl,-rpath=/root/
参数说明:
-I/usr/include/mysql/表示到该目录下找mysql相关头文件
-lmysqlclient表示链接时,必须把libmysqlclient库也链接进来,否则编译通过,但是Apache会提示mysql相关函数未定义错误。
3、apxs2编译c++文件
如果编译C++文件,也必须改名为.c文件,然后类似如下方法(示例为只编译不安装):
apxs2 -ac -S CC=g++ -I../ calcserver.c
如需更多参数可以一并附加到apxs2后面,比如 -I/usr/local/include -lmylib -L/usr/local/lib/mydir
4、几个常见变量
获取客户端IP
r->connection->remote_ip
获取COOKIE
r->headers_in
获取URL参数