Non-modular headers OpenSSL 库在 Swift 框架中使用 modulemap

Non-modular headers of OpenSSL library when using modulemap for Swift framework

我正在尝试 link 静态 OpenSSL 库到我的 Swift 框架,使用 XCode。网上提到的大多数方法都不正确,因为他们建议使用导入路径(SWIFT_INCLUDE_PATHS)。因此,框架二进制文件被锁定到文件系统中的特定位置,二进制文件本身不可移植。虽然这不是世界末日,但我仍然希望能够通过 Carthage 分发二进制文件,而遵循 above-mentioned 方法并不能实现这一点。

我已尝试创建自己的模块映射,其中包含用于框架的伞状 header 文件,并将 OpenSSL 库作为显式模块包含在内,遵循以下文章中描述的方法:https://badootech.badoo.com/bundling-c-library-in-swift-framework-3d9dae950774

这是我的模块映射文件,我将其路径插入到 MODULEMAP_FILE 构建配置变量中。

framework module MyFramework {
    umbrella header "MyFramework.h"
    requires objc

    export *
    module * { export * }

    module COpenSSL [system] {
        header "shim.h"
        link "ssl"
        link "crypto"
        export *
    }
}

其中 shim.h 文件是一个 header 文件,如下所示:

#ifndef __COPENSSL_SHIM_H__
#define __COPENSSL_SHIM_H__

#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/md4.h>
#include <openssl/md5.h>
#include <openssl/sha.h>
#include <openssl/hmac.h>
#include <openssl/rand.h>
#include <openssl/ripemd.h>
#include <openssl/pkcs12.h>
#include <openssl/x509v3.h>

__attribute__((swift_name("SSL_set_tlsext_host_name(_:_:)")))
static inline int shim_SSL_set_tlsext_host_name(const SSL *s, const char *name) {
    return SSL_set_tlsext_host_name(s, name);
};

#endif

这里的问题是,我在尝试编译包含 non-modular headers 的项目时遇到错误。

我已尝试将所有 header 文件作为 public header 文件包含到 XCode 项目中(conf.hevp.h,等等,所有这些)。但问题仍然存在,大概是因为它无法使用 header 包含 #include <openssl/conf.h> 的语法。将包含更改为 #include "conf.h" 等是可行的,但是随后 header 包含的相同样式与 conf.h 和来自 Open SSL 库的所有其他 header 文件一起使用,所以这并没有真正的帮助。

我真的不想修改 OpenSSL 库中的每个 header 文件只是为了让它工作,看来必须有一些更简单的方法。

有什么方法可以不必将这些 header 包含到 XCode 项目中,以便它们仍然可以使用 #include <openssl/conf.h> 的原始语法?

我已经尝试将 HEADER_SEARCH_PATHS 设置为一个路径,从该路径到每个 header 的相对路径是 openssl/conf.h 等,但它根本没有帮助。

谢谢。

最后,我找不到比将所有必需的 headers 列出到模块映射中并将 SSL 库文件的包含宏从 <> 语法重写为简单包含更好的解决方案。我使用这个 shell 小脚本来帮助我:

sed -E -i '' 's/#[[:space:]]*include <openssl\/(.*).h>/#include \"\.h"/' $SCRIPT_DIR/../Libraries/openssl/include/openssl/*.h