第3方模块编译
㈠ 怎么运行apache第三方模块
Apache已经安装完毕并投入运行,但是后来却发现部分模块没有加载,当然有两个方法:
1. 一是完全重新编译Apache, 再安装
2. 编译模块为SO文件,使用LoadMole指令加载扩展模块。
apache安装后追加mod_rewrite
1.apache1.3
apache_1.3.34.tar.gz 解压后的目录为 /root/apache_1.3.34 文中简称为“源码目录”
apache安装目录 /usr/local/apache 文中简称为“目标目录”
步骤:
1、Apache安装rewrite模块的时候需要DBM支持,否则无法编译,所以首先要安装一个GDBM
下载地址:ftp://ftp.gnu.org/gnu/gdbm/
安装步骤:
进入安装目录,
./configure
make
make install
make install-compat (最后行也要执行。否则无法编译出ndbm.h头文件)
如果您不能确定服务器上是否已经装有DBM,那么可以安装一下。否则这步可以跳过。
2、现在到apache源码目录的标准模块目录中(/root/apache_src/src/moles/standard/)中,使用如下指令编译出so文件:
/usr/local/apache/bin/apxs -c mod_rewrite.c -lgdbm
即可得到mod_rewrite.so文件。
备注:"-lgdbm"是用为说明在编译mod_rewrite.c时要把gdbm链接进来。这样在第6步启动apache时就不会报出"dbm fetch"的错误了。
3、现在让apache的apxs来自动向http.conf配置文件中加入LoadMole语句并将mod_rewrite.so文件拷贝到apache/libexec目录
/usr/local/apache/bin/apxs -i -A -n rewrite
/root/apache_1.3.34/src/moles/standard/mod_rewrite.so
备注:命令中的rewrite参数是告诉apxs命令mod_rewrite.so文件中的模块名。在命令执行后,apxs会在LoadMole中为
rewrite加上"_mole"以标名模块名称。
如果你在启动apache时发现总是给出“不能定位API”之类的错误,那就是说明LoadMole后面的模块名的语法要根据您的apache版本加以改变。
4、停止apache
apache/bin/apachectl stop
5、运行配置文件检查命令
apache/bin/apachectl configtest
如显示Syntax OK,则表示整个操作成功。那么可以到第6步。否则根据提示信息进行调试。但只要按照此文所说进行操作是不会出错的。
6、启动apache。
apache/bin/apachectl start
㈡ 求教关于ant引用android第三方工程打包的问题
先把第三方的工程打包成.jar、再引用、一起打包
或者
直接引用第3方工程的源码,编译时一起编译、打包时也一起打包了
㈢ 在计算机编程中 模块是什么意思
一种编程思想,将一个大的程序分成若干个小程序。比如将学生录取系统程序变成一个报名程序,一个比较分数程序,一个通知录取情况程序。功能是方便开发团队里的成员一人负责一个小程序,进而加快一个大程序的开发速度。
㈣ 如何添加第3方lib库到kernel中
你用到什么就添加什么。 如果编译器自动添加的就不需要添加。 比如使用 sndPlaySound就要添加winmm.lib
㈤ 如何安装nginx第三方模块
在原生的nginx,他不可以动态加载模块,所以当你安装第三方模块的时候需要覆盖nginx文件.nginx第三方模块安装方法如下:
1
./configure --prefix=/你的安装目录 --add-mole=/第三方模块目录
以安装pagespeed模块实例
在未安装nginx的情况下安装nginx第三方模块
1
2
3
4
5
6
7
8
# ./configure --prefix=/usr/local/nginx-1.4.1 \
--with-http_stub_status_mole \
--with-http_ssl_mole --with-http_realip_mole \
--with-http_image_filter_mole \
--add-mole=../ngx_pagespeed-master --add-mole=/第三方模块目录
# make
# make isntall
# /usr/local/nginx-1.4.1/sbin/nginx
在已安装nginx情况下安装nginx模块
1
2
3
4
5
6
7
8
9
# ./configure --prefix=/usr/local/nginx-1.4.1 \
--with-http_stub_status_mole \
--with-http_ssl_mole --with-http_realip_mole \
--with-http_image_filter_mole \
--add-mole=../ngx_pagespeed-master
# make
# /usr/local/nginx-1.4.1/sbin/nginx -s stop
# cp objs/nginx /usr/local/nginx/sbin/nginx
# /usr/local/nginx-1.4.1/sbin/nginx
相比之下仅仅多了一步覆盖nginx文件.
总结,安装nginx安装第三方模块实际上是使用–add-mole重新安装一次nginx,不要make install而是直接把编译目录下objs/nginx文件直接覆盖老的nginx文件.如果你需要安装多个nginx第三方模块,你只需要多指定几个相应的–add-mole即可.
㈥ 如何编译linux驱动模块
第一步:准备源代码
首先我们还是要来编写一个符合linux格式的模块文件,这样我们才能开始我们的模块编译。假设我们有一个源文件mymod.c。它的源码如下:
mymoles.c
1. #include <linux/mole.h> /* 引入与模块相关的宏 */
2. #include <linux/init.h> /* 引入mole_init() mole_exit()函数 */
3. #include <linux/moleparam.h> /* 引入mole_param() */
4
5. MODULE_AUTHOR("Yu Qiang");
6. MODULE_LICENSE("GPL");
7
8. static int nbr = 10;
9. mole_param(nbr, int, S_IRUGO);
10.
11. static int __init yuer_init(void)
12.{
13. int i;
14. for(i=0; i<nbr; i++)
15. {
16. printk(KERN_ALERT "Hello, How are you. %d/n", i);
17. }
18. return 0;
19.}
20.
21.static void __exit yuer_exit(void)
22.{
23. printk(KERN_ALERT"I come from yuer's mole, I have been unlad./n");
24.}
25.
26. mole_init(yuer_init);
27. mole_exit(yuer_exit);
我们的源文件就准备的差不多了,这就是一个linux下的模块的基本结构。第9行是导出我们的符号变量nbr。这样在你加载这个模块的时候可以动态修改这个变量的值。稍后将演示。yuer_init()函数将在模块加载的时候运行,通过输出的结果可以看到我们的模块是否加载成功。
第二步:编写Makefile文件
首先还是来看看我们Makefile的源文件,然后我们再来解释;
Makefile
obj-m := moles.o #要生成的模块名
moles-objs:= mymod.o #生成这个模块名所需要的目标文件
KDIR := /lib/moles/`uname -r`/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) moles
clean:
rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions
ARM平台
Makefile
obj-m += mymod.o
KDIR := /home/workspace2/kernel/linux-2.6.25 #如果是用于arm平台,则内核路径为arm内核的路径
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) moles
clean:
rm -rf *.o
在arm板上插入是
insmod mymod
如果出现以下错误
insmod: chdir(/lib/moles): No such file or directory
则运行
mkdir /lib/moles/2.6.25 (与arm内核版本相同)
并将mymod.ko文件复制到该目录下
cp mymod.ko /lib/moles/2.6.25
然后再执行 (insmod 只在/lib/moles/2.6.25目录下查找相关驱动模块)
insmod mymod
现在我来说明一下这个Makefile。请记住是大写的Makefile而不是小写的makefile;
obj-m :这个变量是指定你要声称哪些模块模块的格式为 obj-m := <模块名>.o
moles-objs :这个变量是说明声称模块moles需要的目标文件 格式要求 <模块名>-objs := <目标文件>
切记:模块的名字不能取与目标文件相同的名字。如在这里模块名不能取成 mymod;
KDIR :这是我们正在运行的操作系统内核编译目录。也就是编译模块需要的环境
M= :指定我们源文件的位置
PWD :这是当前工作路径$(shell )是make的一个内置函数。用来执行shell命令。
第三步:编译模块
现在我们已经准备好了我们所需要的源文件和相应的Makefile。我们现在就可以编译了。在终端进入源文件目录输入make
运行结果:
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-24-generic'
CC [M] /home/yuqiang/桌面/mymole/mymoles.o
LD [M] /home/yuqiang/桌面/mymole/moles.o
Building moles, stage 2.
MODPOST 1 moles
CC /home/yuqiang/桌面/mymole/moles.mod.o
LD [M] /home/yuqiang/桌面/mymole/moles.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-24-generic'
第四步:加载/卸载我们的模块
从上面的编译中我可以看到。已经有一个moles.ko生成了。这就是我们的模块了。现在我们就可以来加载了。
首先在终端输入:sudo insmod moles.ko
现在我们来看看我们的模块加载成功没有呢?
在终端输入:dmesg | tail -12 这是查看内核输出信息的意思。tail -12 显示最后12条;
显示结果如下:
[17945.024417] sd 9:0:0:0: Attached scsi generic sg2 type 0
[18046.790019] usb 5-8: USB disconnect, address 9
[19934.224812] Hello, How are you. 0
[19934.224817] Hello, How are you. 1
[19934.224818] Hello, How are you. 2
[19934.224820] Hello, How are you. 3
[19934.224821] Hello, How are you. 4
[19934.224822] Hello, How are you. 5
[19934.224824] Hello, How are you. 6
[19934.224825] Hello, How are you. 7
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
看到了吧。我们的模块的初始化函数yuer_init();已经成功运行了。说明我们的模块已经加载成功;
现在我们再来卸载模块试试看。
在终端输入:sudo rmmod moles
在终端输入:dmesg | tail -3
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
[20412.046932] I come from yuer's mole, I have been unlad.
可以从打印的信息中看到,我们的模块的退出函数已经被执行了。说明我们的模块已经被成功的卸载了。到目前位置我们就已经算是对模块的编译到编译运行算是有了一个整体上的认识了。对于以后深入的学习还是应该有点帮助的。下面我们将在看看于模块相关的一些简单的操作。
第五步:加载模块时传递参数
在终端输入:sudo insmod mole_name.ko nbr=4
在终端输入:dmesg | tail -6
显示结果如下:
[20800.655694] Hello, How are you. 9
[21318.675593] I come from onefile mole, I have been unlad.
[21334.425373] Hello, How are you. 0
[21334.425378] Hello, How are you. 1
[21334.425380] Hello, How are you. 2
[21334.425381] Hello, How are you. 3
这样我们就可以看到在模块加载的时候动态设置了我们的一个变量。初始化函数中的循环只执行了4次。
可能你会问我怎么知道一个模块可以设置那些变量呢。当然,你可以先不设变量加载一次。然后可以在终端输入ls /sys/mole/<moles_name>/parameters/来查看。在这里我们是这样输入的
在终端输入:ls /sys/moedle/moles/parameters/
显示结果:
nbr
如果我们的模块加载成功了。最后我们还可以通过modinfo来查看我们的模块信息。如下
在终端输入:sudo modinfo moles.ko
显示结果:
filename: moles.ko
license: GPL
author: Yu Qiang
srcversion: 20E9C3C4E02D130E6E92533
depends:
vermagic: 2.6.24-24-generic SMP mod_unload 586
parm: nbr:int
㈦ Nginx基础篇----虚拟主机、日志、模块、请求限制
在企业中,我们有很多的业务服务A,B,C等等,按照最最传统的财大气粗方式就是在一台机器上搭建一个Nginx,并且一个Nginx只为一个业务进行服务,如下图所示,我们有3个业务服务,我们就在3个机器上搭建3个Nginx,这显然是很浪费资源的一种不合理方式。
虚拟主机的方式是指,我们在同一个Nginx上运行多套单独服务,而且这些服务是独立的,如下图所示:
基于主机多IP的方式有两种:
第一步 :在单网卡上添加多个IP--ip a add ip地址 设备名
第二步 :我们找到nginx.conf中的http中的include的配置,找到其include的文件路径
第三步 :找到默认配置文件,进行复制,将server中的listen进行改动,改为ip:port,在这里如果我们要为3个业务服务的话,我们就设置三个.conf的配置文件,每个配置文件中的ip不同即可。
第四步 :nginx -s stop -c /etc/nginx/nginx.conf
nginx -s表示给nginx的主进程发送信号,停止应用。-c表示启动的时候使用哪个配置文件。
第一步 :我们找到nginx.conf中的http中的include的配置,找到其include的文件路径
第二步 :找到默认配置文件,进行复制,将server中的listen 端口进行改动即可,每个配置文件中的端口不同即可。
第三步 :nginx -tc /etc/nginx/nginx.conf 对刚才修改的配置文件进行语法检查
第四步 :nginx -c /etc/nginx/nginx.conf 启动nginx
更改server_name :
Nginx的日志类型有error.log和access_log两类。error.log用于记录错误类型的日志,access_log记录的是请求访问的相关的日志。Nginx使用了log_format把各种类型的变量进行组织,然后记录到access_log当中去。
log_format只能配置到http模块下,所以我们看到nginx.conf中,会看到log_format的使用方式如下图所示:
Nginx的模块分为官方的模块和第三方的模块,我们可以通过命令行nginx -V看到很多的--with-XXXX,这些就是Nginx中的模块。
编译选项--with-http_stub_status_mole,用于展示Nginx当前处理连接的状态。这个模块默认是没有打开的,它必须要用户显示的server和location模块中进行配置。
我们在nginx.conf中配置好后,通过IP:PORT/mystatus进行访问,会看到以下结果:
该模块使用的比较少,它表示是从目录中随机选取一个主页。语法规则 random_index on | off,默认情况下是random_index off;只能放在location的上下文中。
这个模块也用的不多,它主要用于对http的响应内容作替换。包含了很多用法:
sub_filter string replacement 默认是不开启的,可以用在http,server,location中,作用是替换html中的字符。
sub_filter_last_modified on | off,默认是off,可以用在http,server,location中,作用是否阻止response header中写入Last-Modified,防止缓存,默认是off,即防止缓存。
sub_filter_once on | off,默认是on,可以用在http,server,location中,作用sub_filter指令是执行一次,还是重复执行,默认是只执行一次。
Nginx中可以对连接频率和请求频率做限制。其中连接频率限制的模块是limit_conn_mole,请求频率限制的模块是limit_req_mole。
请求和连接到底有什么区别呢?我们知道HTTP协议是建立在TCP协议之上的,客户端在向服务端发起请求的时候,必须先建立三次握手连接,建立完连接之后才开始发送请求,为了保持这个连接我们使用FIN和ACK,这样就可以在一个连接中多次发起请求,因此我们可以说HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP请求。
连接限制的语法:
定义空间:
limit_conn_zone key zone=name:size 默认是没有的,只能在http中配置,如果说我们想对用户的IP地址做限制,那么这里的key我们可以配置成$remote_addr,这里的name可以随便命名,size设置大小
limit_conn zone number;这里的zone必须和上面的limit_conn_zone中的name对应,number表示的是连接数,默认是没有的,可以在http,server,location中配置。
请求限制的语法:
定义空间:
limit_req_zone key zone=name:size rate=rate默认是没有的,只能在http中配置
limit_req zone name [burst=number] [nodelay];这里的zone必须和上面的limit_req_zone中的name对应,number表示的是连接数,默认是没有的,可以在http,server,location中配置;burst爆发的意思,这个配置的意思是设置一个大小为N的缓冲区,当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内;nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队.
$binary_remote_addr是限制同一客户端ip地址,binary_remote_addr和remote_addr其实是一样的,但是binary_remote_addr要更节省空间。1m 可以储存 32000 个并发会话。zone=req_zone:1m表示生成一个大小为1M,名字为req_one的内存区域,用来存储访问的频次信息;rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。这里我使用abtest来演示一下各种情况:
配置每秒钟最多一次请求:
使用abtest发起请求,设置并发数20,发起20次请求。测试结果,成功1次,失败19次,符合预期:
查看nginx错误日志,图中刚好有19个error记录,而且是被限制了,符合预期:
设置一个大小为3的缓冲区,超过访问频次限制的请求将会放入到缓冲区中:
使用abtest发起请求,设置并发数20,发起20次请求。测试结果,成功4次,失败16次,符合预期,因为第一次成功后,超过了请求限制,放了3个请求到缓冲区中,所以总共成功4个:
查看nginx错误日志,图中刚好有16个error记录,而且是被限制了,符合预期:
设置最大连接数为1:
使用abtest发起请求,设置并发数20,发起20次请求。测试结果,成功20次,失败0次,符合预期:
查看nginx错误日志,无任何错误日志,符合预期。
nginx的http_access_mole模块实现的,相关语法如下图所示:
~表示模式匹配,这里我们表示凡是访问admin.html的请求,阻止180.158.232.219的访问,同时允许所有的IP访问。结果如下图所示:
请求成功:
是nginx的http_auth_basic_mole模块实现的,使用方式可以具体参考 http://nginx.org/en/docs/http/ngx_http_auth_basic_mole.html 这里不再赘述
Nginx的基础篇就讲到这里,欢迎大家指正,下一篇文章我将介绍如何使用Nginx作为静态资源Web服务。
㈧ delphi 如何安装第3方控件
由于组件提供的方式不同,所以安装的方法也是不一样的,下面就目前常见的各种形式的组
件的安装方法介绍一下。
1只有一个DCU文件的组件。DCU文件是编译好的单元文件,这样的组件是作者不想把源码公
布。一般来说,作者必须说明此组件适合Delphi的哪种版本,如果版本不对,在安装时就会
出现错误。也正是因为没有源码,给使用者带来了不便,那就是一旦Delphi版本升级,此组
件就不能再使用了,当然有的作者给出了几种版本的DCU文件,用户根据需要选择使用。这
样的组件的安装方法是:在Component菜单中,选择install component,在对话框中的
"into existing package"页中,单击“Unit file name”后的“Browse”按钮,在打开的
文件对话框中,将“文件类型”设定为*.dcu,找到要安装的DCU文件,按OK按钮返回
"into existing package"页后再按OK按钮就可以安装了。注意,此时Delphi会提示
dclusr40.dpk将被重建,是否继续,OK就可以了。这里是将组件安装到dclusr40.dpk包中,
此包从文件名上可以看出是用户自定义组件包,先安装到这个包中吧,下面再讲有关注意
事项。安装完毕会有已经将组件注册完的提示信息以及安装到哪个组件页中的信息等,到
组件面板上看看,一般会出现一个新的组件页,其中有刚安装的组件。
2、只有PAS文件或既有PAS又有DCU文件的组件。这种组件因为有PAS文件,也就是说作者提
供了源码,这就好办多了。安装的方法和上面是一样的,在文件类型中可以设定为DCU也可
以设定为PAS,建议设定为PAS,这样可用你的Delphi重新编译一下,看是否会出现问题。
Delphi升级后只能选择PAS文件安装,这样才能重新编译,使得组件能适应新Delphi版本。
这样的组件是很值得使用的,根据心铃的经验,没有源码的组件最好不要使用,一是存在
Delphi版本升级后无法使用的问题,再者当程序出现问题后用户无法调试组件来判断是否
是组件中存在BUG。
3、有dpk文件的组件包。带有dpk文件的组件包一般是有多个组件构成的,也就是说安装后
会有多个组件供使用,如果只有一个组件作者一般不会制成DPK文件,使用上面的方式发布
就可以了。对于这样的组件包,一般来说会有详细的安装说明文件,如上面提到的RXLIB,
由于组件复杂且安装时有先后顺序,作者不提供安装说明用户根本无法正确安装。如果没
有安装说明文件,那么用下面的方法安装:在File菜单下,选择”OPEN…”打开dpk文件
(文件类型列表框中选*.dpk),在出现的Package窗口中,工具栏上有Install按钮,按此
按钮即可进行安装。如果Install按钮处于无效状态,那么先按Compile按钮编译,一般
来说编译之后Install按钮就会处于有效状态,此时再按Install按钮就可以了。
4、带有Bpl文件的组件包。一般来说这也是由多种组件构成的组件包,它其实是一个动态
连接库文件(DLL)。对于这种组件包的安装方法是:在component菜单下选择
“install packages”,然后单击Add按钮,在打开的文件对话框中找到相应的bpl文件打
开返回后,再单击Ok按钮就可以了。
5、ActiveX控件的安装。要安装这类控件,需要先用regsvr32.exe注册,然后选择
Component菜单中Import ActiveX Control项。在Import ActiveX Control打开的窗口中,
只有已经注册的ActiveX控件才出现在列表中,选中一个然后按Install按钮就可以安装了。
如果事先没有用regsvr32.exe注册也可以按ADD按钮找到OCX文件即时注册,注册后再进行
安装。
几点说明:1 在拿到组件后先看是否有说明文件,一般来说在说明文件中有如何安装的
指导,有些还会有组件的属性、事件、方法的使用说明,这些在使用时是非常重要的。
2 在上面的组件(包)安装操作之前,最好将 *.bpl拷贝到你的System目录中,将
*.pas、*.dcu、*.dcr、*.dp?拷贝到Delphi的Lib目录中再进行。3 前面我们提到安
装DCU组件时,选用的是已经存在的dclusr40.dpk,当然也可以选择安装到一个新的包中,
如果选择新包,需要先取一个名字比如DEMO,事实上安装完毕后用户可以找到的是
Demo.bpl,而找不到DEMO.DPK。假如你已经将一个组件安装到dclusr40.dpk中了,还想再
安装一个组件,如果再安装到dclusr40.dpk中,安装后你得到提示,原来安装的那个组件
已经被取消注册,你将无法使用了。这样不就成了只能安装一个组件了吗?除非你再安装
到一个新的包中才可以两个组件同时使用。当然每安装一个组件生成一个新的BPL文件也
未偿不可,但BPL文件就增加许多。能否在dclusr40.dpk中多安装几个组件呢?当然是可
以的。方法如下:用File菜单下的OPEN打开dclusr40.dpk文件,单击ADD按钮,在打开的
对话框中选择ADD UNIT页面,按Unit file name后的“Browse”按钮打开组件单元文件,
OK即可,用此种方法这样可添加多个组件的单元文件,添加完毕,按一下编译按钮,然后
再按Install按钮即可,如果单元文件是编译好的(DCU)可以直接按安装按钮。4 组件的
删除。光会安装可不行,还要会删除呀。很简单,在component菜单下,选择
install packages,在列表中找到安装所在的Bpl,按Remove按钮,ok!再把Bpl文件删掉
就彻底了,如果不删除BPL文件,下次可以按安装BPL组件的方法再安装使用。
㈨ 易语言里3个编译各有什么用
第一个编译是你编好程序后只能在你自己电脑上或者有易语言的电脑上才能用,第二个静态编译这个是我们用的最多的,它可以把你编好的程序所用的代码打包,这样你在给别人发送后对方直接就能用了,最后一个我们应该用不到,那个直接生成的是一个安装程序的,那个得花钱买正版人才能用。