在Ubuntu 22上编译Apache 2.4.25时遇到链接错误求助
看起来你这是Apache 2.4.25和当前使用的OpenSSL 1.1.0h兼容性不匹配导致的链接错误,这些未定义的函数引用都是因为编译器找不到对应OpenSSL版本里的实现,我给你几个实际可行的解决思路:
显式指定OpenSSL路径重新配置
有时候编译脚本没正确识别OpenSSL的安装位置,你可以在Apache的configure阶段明确指定OpenSSL的路径,同时确保APR和APR-Util的路径也正确:./configure --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --with-ssl=/usr/local/ssl这里的
/usr/local/ssl要换成你实际的OpenSSL安装路径,如果是系统自带的版本,路径可能是/usr。配置完成后重新执行make clean && make试试。降级OpenSSL到兼容版本
Apache 2.4.25是2017年的版本,而OpenSSL 1.1.0系列做了不少API变更,比如你报错里的SSLv2_client_method在这个版本里已经被默认禁用甚至逐步移除了(毕竟SSLv2是极不安全的协议)。你可以试着降级到OpenSSL 1.0.2系列(比如1.0.2u,这是该分支最后一个安全维护版本),编译安装后再重新编译Apache,兼容性会好很多。手动修改代码适配OpenSSL 1.1.0
如果不想降级OpenSSL,也可以直接修改support/ab.c里的代码来适配:- 删掉
CRYPTO_malloc_init()的调用,这个函数在OpenSSL 1.1.0里已经被移除,内存管理会自动初始化; - 把
SSLv2_client_method()替换成TLS_client_method(),或者如果你确实需要SSLv2支持,得先确保编译OpenSSL时启用了SSLv2(默认是关闭的); - 把
EVP_PKEY_bits()替换成EVP_PKEY_get_bits(),这是OpenSSL 1.1.0里的新函数名。
- 删掉
重新编译APR-Util关联OpenSSL
有时候APR-Util在编译时没正确链接OpenSSL,导致Apache编译时找不到相关依赖。你可以重新编译APR-Util:./configure --with-apr=/usr/local/apr --with-ssl=/usr/local/ssl make && make install完成后再回到Apache的目录重新编译。
备注:内容来源于stack exchange,提问作者Shinomoto Asakura

