6

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

我尝试使用框架的总括头文件创建自己的模块映射,并将 OpenSSL 库作为显式模块包括在内,遵循以下文章中描述的方法:https ://badootech.badoo.com/bundling-c-library-在-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.hfile 是一个头文件,如下所示:

#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

这里的问题是,在尝试编译有关包含非模块化头文件的项目时出现错误。

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

我真的不想为了让它工作而修改 OpenSSL 库中的每个头文件,似乎必须有一些更简单的方法来解决这个问题。

有没有办法不必将这些标头包含到 XCode 项目中,以便它们仍然可以使用原始语法#include <openssl/conf.h>

我尝试设置HEADER_SEARCH_PATHS到每个标题的相对路径openssl/conf.h等的路径,但它根本没有帮助。

谢谢。

4

1 回答 1

1

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

sed -E -i '' 's/#[[:space:]]*include <openssl\/(.*).h>/#include \"\1\.h"/' $SCRIPT_DIR/../Libraries/openssl/include/openssl/*.h
于 2020-07-24T13:42:39.917 回答