是否可以在 apache.exe 中静态编译模块?
在 Linux 和 Mac 上,我都可以构建一个独立的 apache exec (httpd),其中包含所有依赖项 (apr、apr-util、pcre) 和我需要的模块,但在 Windows 上,我只能构建一个独立的 apache.exe (仅包含 apr.dll、apr-util.dll 和其他依赖项),而不包含模块。例如,我无法在 httpd.conf 文件中使用 Order 指令,因为所需的模块未包含在 apache.exe 中。
我修改了许多 mak 文件,包括 httpd.mak 文件,以便以这种方式使用 link.exe 构建 apache.exe:
link.exe 发布\main.obj \ 发布\httpd.res\ srclib\apr\发布\libapr.lib \ srclib\pcre\Release\pcre.lib \ srclib\apr-iconv\Release\libapriconv.lib \ 发布\my_modules.lib\ 发布\libhttpd.lib
每个 .lib 文件都包含使用 lib.exe 静态构建的所有 obj 文件
以这种方式构建时,“my_modules.lib”似乎被忽略了,并且所有 obj 模块文件均未包含在 apache.exe 中(例如 mod_authn_file.obj、mod_expires、mod_actions 等等...)。
如果我在构建过程中以这种方式明确添加 obj 文件:
link.exe 发布\main.obj \ 发布\httpd.res\ srclib\apr\发布\libapr.lib \ srclib\pcre\Release\pcre.lib \ srclib\apr-iconv\Release\libapriconv.lib \ 发布\libhttpd.lib \ 模块\发布\mod_authn_file.obj \ 模块\Release\mod_expires.obj \ 模块\发布\mod_actions.obj \ ......(其他目标模块)
apache.exe 的大小会增加,但是如果我使用命令 apache.exe -M 查看已加载的模块,我只会发现:
core_module (静态) win32_module (静态) mpm_winnt_module (静态) http:module (静态) so_module (静态)
[这是所有未包含在 my_modules.lib 中的模块]
使用 Dependency Walker 我可以看到 apache.exe 中的所有模块:
动作模块 别名模块 _ap_get_server_built@0 auth_basic_模块 authn_default_module authn_file_module authz_default_module authz_groupfile_module authz_host_module authz_user_module cgi_模块 目录模块 expires_module 过滤器模块 http_module 日志配置模块 mime_模块 mpm_winnt_模块 设置环境变量 so_模块 状态模块 版本_模块 win32_模块
看起来模块已经链接但尚未启用......
我希望有人能帮助我。
答案1
我已经解决了...
我通过以下方式修改了 os/win32/ 文件夹中的 modules.c 文件:
#取消定义 AP_DECLARE_EXPORT #定义 AP_DECLARE_STATIC #定义 CORE_PRIVATE #包括“httpd.h” #包括“http_config.h” 外部模块 core_module; 外部模块 win32_module; 外部模块 mpm_winnt_module; 外部模块http_module; 外部模块so_module; 外部模块 authn_file_module; 外部模块 authn_default_module; 外部模块 authz_host_module; 外部模块 authz_groupfile_module; 外部模块 authz_user_module; 外部模块 authz_default_module; 外部模块 auth_basic_module; 外部模块 filter_module; 外部模块 deflate_module; 外部模块log_config_module; 外部模块 expires_module; 外部模块setenvif_module; 外部模块版本_模块; 外部模块 ssl_module; 外部模块 mime_module; 外部模块状态模块; 外部模块cgi_module; 外部模块 dir_module; 外部模块actions_module; 外部模块别名_模块; AP_DECLARE_DATA 模块 *ap_prelinked_modules[] = { &核心模块, &win32_模块, &mpm_winnt_模块, &http_模块, &so_模块, &authn_file_模块, &authn_默认模块, &authz_host_module, &authz_groupfile_模块, &authz_用户_模块, &authz_默认模块, &auth_基本模块, &过滤模块, &deflate_模块, &日志配置模块, &expires_module, 设置环境变量模块, &版本模块, &ssl_模块, &mime_模块, &状态模块, &cgi_模块, &目录模块, &actions_模块, &别名模块, 无效的 }; ap_module_symbol_t ap_prelinked_module_symbols[] = { {"核心模块", &核心模块}, {"win32_module", &win32_module}, {"mpm_winnt_module", &mpm_winnt_module}, {"http_module", &http_module}, {"so_module", &so_module}, {"authn_file_module", &authn_file_module}, {“authn_default_module”,&authn_default_module}, {"authz_host_module", &authz_host_module}, {"authz_groupfile_module", &authz_groupfile_module}, {"authz_user_module", &authz_user_module}, {"authz_default_module", &authz_default_module}, {"auth_basic_module", &auth_basic_module}, {"过滤模块", &过滤模块}, {“deflate_module”, &deflate_module}, {"日志配置模块", &日志配置模块}, {"expires_module", &expires_module}, {"setenvif_module", &setenvif_module}, {"版本模块", &版本模块}, {"ssl_module", &ssl_module}, {"mime_module", &mime_module}, {"status_module", &status_module}, {"cgi_模块", &cgi_模块}, {"目录模块", &目录模块}, {"actions_module", &actions_module}, {"别名模块", &别名模块}, {空,空} }; AP_DECLARE_DATA 模块 *ap_preloaded_modules[] = { &核心模块, &win32_模块, &mpm_winnt_模块, &http_模块, &so_模块, &authn_file_模块, &authn_默认模块, &authz_host_module, &authz_groupfile_模块, &authz_用户_模块, &authz_默认模块, &auth_基本模块, &过滤模块, &deflate_模块, &日志配置模块, &expires_module, 设置环境变量模块, &版本模块, &ssl_模块, &mime_模块, &状态模块, &cgi_模块, &目录模块, &actions_模块, &别名模块, 无效的 };
然后我使用以下命令重新编译 modules.obj 文件:
C:\Documents 和 Settings\sessa\Desktop\httpd-2.2.17-win32-src\httpd-2.2.17_21> cl.exe /nologo /MT /W3 /Zi /O2 /Oy- /I “./srclib/pcre” /I “./include” /I “./srclib/apr/include” /I “./srclib/apr-util/include” /I “./server/mpm/winnt” /I “./modules/http” /I “./modules/proxy” /I “./modules/mappers” /I “./server” /I “./modules/generators” /I “./modules/filters” /D “NDEBUG” /D “WIN32” /D “_CONSOLE” /D “APR_DECLARE_STATIC” /D “AP_DECLARE_STATIC” /D “API_DECLARE_STATIC” /D “APU_DECLARE_STATIC” /D “PCRE_STATIC” /Fo“Release\\” /Fd“Release\modules_sessa”/FD /c ./os/win32/modules.c
然后我重建 apache.exe 并执行 apache.exe -M:
已加载模块: core_module (静态) win32_module (静态) mpm_winnt_module (静态) http_module (静态) so_module (静态) authn_file_module (静态) authn_default_module (静态) authz_host_module (静态) authz_groupfile_module (静态) authz_user_module (静态) authz_default_module (静态) auth_basic_module (静态) filter_module (静态) log_config_module (静态) expires_module (静态) setenvif_module (静态) version_module (静态) deflate_module (静态) ssl_module (静态) mime_module (静态) status_module (静态) cgi_module (静态) dir_module (静态) action_module (静态) alias_module (静态) 语法正确
因此,我通过这种方式为 win32 静态编译了一个 apache 2.2.17!