如何在 Apache 2.2.17 中为 Win32 静态编译模块

如何在 Apache 2.2.17 中为 Win32 静态编译模块

是否可以在 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!

相关内容