ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Apache模块 mod_so | [说明](#calibre_link-11) | 允许运行时加载DSO模块 | | --- | --- | | [状态](#calibre_link-12) | 扩展(E) | | [模块名](#calibre_link-13) | so_module | | [源文件](#calibre_link-14) | mod_so.c | | [兼容性](#calibre_link-58) | 在Windows上这是一个基本模块(始终包含) | ### 概述 该模块在支持动态链接机制的操作系统上可以用来在Apache启动和重启时加载[DSO](#calibre_link-259)模块,而不用重新编译。 在Unix上,被加载的可执行代码通常来自于共享对象文件(一般以`.so`为扩展名),在Windows上则为`.so`或`.dll`扩展名。 ### 警告 用于Apache1.3的模块不能直接用于Apache2.0 。 ## 为Windows创建可加载模块 ### 注意 从Apache1.3.15开始,Windows上的模块名规则发生了变化,现在使用mod_foo.so格式的名字。 Apache模块的API对于Unix和Windows是一样的。许多模块在这两个平台间移植几乎不需要什么修改,除非那些依赖于Unix特定属性而Windows没有提供的模块。 如果一个模块可用,那么有两种方法使用它。在Unix上,可以被静态编译进服务器。因为用于Windows的Apache并没有相应于Unix下的`Configure`编译配置程序,模块的源文件必须被加进ApacheCore项目文件,并且它的符号(symbols)必须被添加到`os\win32\modules.c`文件。 第二种方法是编译为一个动态链接库(DLL),以便在运行期间使用`LoadModule`指令加载。这些模块DLL在Apache安装期间就已经安装好了,不需要你自己去编译。 为了将模块编译为DLL,需要对模块的源文件做一个小小的修改:模块记录(module record)必须从DLL导出(稍后将会创建,见下)。为了达到这个目的,请将`AP_MODULE_DECLARE_DATA`(在Apache头文件中定义的)添加到你的模块记录(module record)定义中。比如,如果你的模块有: ``` module foo_module; ``` 将上述内容替换为: ``` module AP_MODULE_DECLARE_DATA foo_module; ``` 注意,这仅在Windows上有效,因此该模块可以不加修改的直接在Unix上使用。另外,如果你对`.DEF`文件很熟悉,你也可以使用它代替前面的方法导出该模块。 要创建一个包含该模块的DLL文件,你还必须将它连接到在编译libhttpd.dll共享库时创建的libhttpd.lib导出库。你还可能需要修改编译器设置以确保Apache头文件被正确的加载了。这些库位于服务器根目录下的"modules"目录中。最好是从中抓出一个已经存在的模块.dsp文件来看看以确保编译环境配置无误,或者按照.dsp文检查编译器和连接器的选项也可。 这样将会为你的模块创建一个DLL版本。只要将它放置到`modules`目录下,并使用`LoadModule`指令加载即可。 ## LoadFile 指令 | [说明](#calibre_link-18) | 加载已命名的目标文件或库 | | --- | --- | | [语法](#calibre_link-19) | `LoadFile _filename_ [_filename_] ...` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 扩展(E) | | [模块](#calibre_link-22) | mod_so | 该指令用于在服务器启动或者重启时加载已命名目标文件或库,以用于加载需要被某些模块使用的额外代码。_Filename_可以是一个绝对路径或者相对于`ServerRoot`的相对路径。 例如: ``` LoadFile libexec/libxmlparse.so ``` ## LoadModule 指令 | [说明](#calibre_link-18) | 加载目标文件或库,并将其添加到活动模块列表 | | --- | --- | | [语法](#calibre_link-19) | `LoadModule _module filename_` | | [作用域](#calibre_link-20) | server config | | [状态](#calibre_link-21) | 扩展(E) | | [模块](#calibre_link-22) | mod_so | 该指令加载目标文件或库_filename_并将模块结构名_module_添加到活动模块列表。_module_就是源代码文件中用于拼写`module`的外部变量名,并作为[模块标识符(Module Identifier)](#calibre_link-13)列在模块文档中。例如: ``` LoadModule status_module modules/mod_status.so ``` 加载了位于`ServerRoot`下模块目录中指定的模块。