C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)
C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)
名词解释:apxs
apxs is a tool for building and installing extension modules for the Apache HyperText Transfer Protocol (HTTP) server.
apxs是用来编译和安装 apache 服务器的扩展模块(mod)、也能生成项目模版(下面有具体使用说明)
名词解释:MinGW
MinGW,是Minimalist GNUfor Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,
允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。
MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,
在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,
可以使用微软提供的 C 运行时(C Runtime)扩展,与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 WindowsAPI功能。
一、apache mod模块 windows开发
1)
下载apxs apxs_win32.tar.gz,下载地址
http://download.csdn.net/detail/tengyunjiawu_com/9811400
2)
安装strawberryperl或active perl
下载地址:http://strawberryperl.com/releases.html
我安装的是active perl,所以还需要安装 dmake
dos命令行执行:ppm install dmake
3)解压apxs_win32.tar.gz
解压到C:\apache\apache2.4.9\bin\apxs
4)进入C:\apache\apache2.4.9\bin\apxs目录
perl Configure.pl --with-apache2=D:/wamp/bin/apache/apache2.4.9 --with-apache-prog=httpd.exe
5)切换到Apache安装目录下的bin文件夹中,输入apxs,
cd C:\apache\apache2.4.9\bin
apxs
输出:如有解释apxs用法的文本出现(如下),则表明安装完成。
D:\wamp\bin\apache\apache2.4.9\bin>apxs
Usage: apxs -g [-S <var>=<val>] -n <modname>
apxs -q [-v] [-S <var>=<val>] <query> ...
apxs -c [-S <var>=<val>] [-o <dsofile>] [-D <name>[=<value>]]
[-I <incdir>] [-L <libdir>] [-l <libname>] [-Wc,<flags>]
[-Wl,<flags>] [-p] <files> ...
apxs -i [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
apxs -e [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
6)将apxs所在的目录设置加入系统环境变量PATH
7)使用apxs
apxs编译时还需用到C/C++编译器,一般有两种选择,一种是使用VC(Visual Studio)自带的编译器,还有一种就是自行安装,比如minGW等。
对使用VS编译的,可尝试修改apache下的build目录中config_vars.mk配置文件:
CC = gcc 的gcc改为cl.exe
LD = g++的g++改为link.exe
CPP = gcc-E的gcc-E删掉
我因为使用的是mingw,所以,实际应用步骤可能不太完整,所以使用VS2017编译的时候没有使用apxs进行编译
vs2017编译如下:
8)用VS2017编译apache模块
a)运行apxs -g -n helloworld(helloworld为模块名),会生成一个叫helloworld的目录和模板代码
b)打开vs2017建立一个空的C语言项目,项目名称mod_helloworld,将上面用apxs生成的mod_helloworld.c拖进项目
c)项目设置部分
1、include C:\apache\apache2.4.9\include
2、lib部分附加目录库 C:\apache\apache2.4.9\lib
3、链接器,命令行,其他选项添加 libapr-1.lib libaprutil-1.lib libapriconv-1.lib libhttpd.lib
4、代码生成 运行库选择:多线程 (/MT)
d)进入helloworld目录,编辑mod_helloworld.c(这就是我们要开发的内容),代码如下:
=========================================================================================
/*
** mod_helloworld.c -- Apache sample helloworld module
** [Autogenerated via ``apxs -n helloworld -g'']
**
** To play with this sample module first compile it into a
** DSO file and install it into Apache's modules directory
** by running:
**
** $ apxs -c -i mod_helloworld.c
**
** Then activate it in Apache's httpd.conf file for instance
** for the URL /helloworld in as follows:
**
** # httpd.conf
** LoadModule helloworld_module modules/mod_helloworld.so
** <Location /helloworld>
** SetHandler helloworld
** </Location>
**
** Then after restarting Apache via
**
** $ apachectl restart
**
** you immediately can request the URL /helloworld and watch for the
** output of this module. This can be achieved for instance via:
**
** $ lynx -mime_header http://localhost/helloworld
**
** The output should be similar to the following one:
**
** HTTP/1.1 200 OK
** Date: Tue, 31 Mar 1998 14:42:22 GMT
** Server: Apache/1.3.4 (Unix)
** Connection: close
** Content-Type: text/html
**
** The sample page from mod_helloworld.c
*/
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
/* The sample content handler */
static int helloworld_handler(request_rec *r)
{
if (strcmp(r->handler, "helloworld")) {
return DECLINED;
}
r->content_type = "text/html";
if (!r->header_only)
ap_rputs("小样,用C语言开发一个Apache的Module,这下牛逼了吧\n", r);
return OK;
}
static void helloworld_hooks(apr_pool_t *p)
{
ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA helloworld_module = {
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
NULL, /* table of config file commands */
helloworld_hooks /* register hooks */
};
=========================================================================================
e)编译生成如下图:
f)将mod_helloworld.dll拷贝到Apache2.2\modules下
g)修改Apache2.2\conf\httpd.conf,在末尾加上
LoadModule helloworld_module modules/mod_helloworld.dll #(dll改成扩展名.so也一样的)
<Location /helloworld>
setHandler helloworld
</Location>
h)启动apache,在浏览器里面输入http://loacalhost/helloworld,就可以看到我们返回的内容)
大功告成
9)VS2017整体工程代码,下载地址:
http://download.csdn.net/detail/tengyunjiawu_com/9811386
10)运行结果如下:http://loacalhost/helloworld
本人原创,未经许可,可以随意转载!
C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)的更多相关文章
- C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇)
C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇) 名词解释:apxs apxs is a tool for building and installi ...
- 软件开发流变史:从瀑布开发到敏捷开发再到DevOps
作为在20世纪70年代.80年代盛极一时的软件开发模型,瀑布模型通过制定计划.需求分析.软件设计.程序编写.软件测试.运行维护等6个流程将整个软件生命周期衔接起来.这6个流程有着严格的先后次序之分,只 ...
- Apache Solr采用Java开发、基于Lucene的全文搜索服务器
http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Luc ...
- OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统
OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统 OSGi 的核心:模块化.动态.基于 OSGi 就可以模块化的开发 java 应用,模块化的部署 java 应用,还可以动态管理 ...
- Apache Mod/Filter Development
catalog . 引言 . windows下开发apache模块 . mod进阶: 接收客户端数据的 echo 模块 . mod进阶: 可配置的 echo 模块 . mod进阶: 过滤器 0. 引言 ...
- 10个强大的Apache开源模块
1.单点登录模块 LemonLDAP LemonLdap可以很棒地实现Apache的SSO功能,并且可以处理超过 20 万的用户请求.LemonLdap支持Java, PHP, .Net, Perl, ...
- OSGi是什么:Java语言的动态模块系统(一)
OSGi是什么 OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构.OSGi容器已有多家开源实现,比如Knoflerfish.Equinox和Apache的Felix.您 ...
- 开启Apache mod_rewrite模块(解决404 Not Found)
网站搭建完成了,进入登录界面就是访问不了. 原因大概是没有开启Apache mod_rewrite模块,或者没有配置完全. 步骤1: 启用mod_rewrite模块 在conf目录的httpd.con ...
- Apache Spark1.1.0部署与开发环境搭建
Spark是Apache公司推出的一种基于Hadoop Distributed File System(HDFS)的并行计算架构.与MapReduce不同,Spark并不局限于编写map和reduce ...
随机推荐
- 2018.09.09 UVa10529 - Dumb Bones(期望dp)
传送门 期望dp好题. f[i]表示摆放i个的最小花费,于是f[i]可以从f[j]与f[i-j+1]转移过来了. 代码: #include<bits/stdc++.h> #define N ...
- 17 Privacy Lost:Dose Anybody Care ? 失去隐私,有人在乎吗 ?
Privacy Lost:Dose Anybody Care ? 失去隐私,有人在乎吗 ? ①Someday a stranger will read your e-mail without your ...
- 程序员面试50题(1)—查找最小的k个元素[算法]
题目:输入n个整数,输出其中最小的k个.例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数 ...
- UVa 11346 Probability (转化+积分+概率)
题意:给定a,b,s,在[-a, a]*[-b, b]区域内任取一点p,求以原点(0,0)和p为对角线的长方形面积大于s的概率. 析:应该明白,这个和高中数学的东西差不多,基本就是一个求概率的题,只不 ...
- wordpaster更新说明
官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/wordpaster/index.aspx 在线演示:FCKEditor2x示例 ...
- Lucene.net 性能《第八篇》
一.IndexReader性能分析 IndexReader完成了打开所有索引文件和提供底层reader API等繁重的工作,而IndexSearch则要简单得多.由于打开一个IndexReader需要 ...
- hdu 4268 贪心+set lower_bound用法
http://acm.hdu.edu.cn/showproblem.php?pid=4268 A想用手里的牌尽量多地覆盖掉B手中的牌.. 牌有h和w 问A手中的牌最多能覆盖B多少张牌 iterator ...
- git提交提示workspace.xml出现conflicted
问题:在github上管理项目,多次提交以后提交提示workspace.xml出现conflicted原因:Android项目在根目录的.gitignore文件中没有添加.idea文件夹忽略. 解决办 ...
- Linq to Object 的简单使用示例
语言集成查询 (LINQ) 是 Visual Studio 2008 中引入的一组功能,可为 C# 和 Visual Basic 语言语法提供强大的查询功能. LINQ 引入了标准易学的数据查询和更新 ...
- EF添加Msysql实体异常:表“TableDetails”中列“IsPrimaryKey”的值为 DBNull。 ---> System.InvalidCastException: 指定的转换无效。
尝试一下以下步骤: 1.关闭VS项目, 以管理员权限来打开: 1.执行语句 set global optimizer_switch='derived_merge=OFF'; set optimizer ...