我正在尝试使用 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.h
file 是一个头文件,如下所示:
#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
等的路径,但它根本没有帮助。
谢谢。