【发布时间】:2019-06-14 14:05:57
【问题描述】:
我正在尝试使用 XCode 将 OpenSSL 库静态链接到我的 Swift 框架。网上提到的大多数方法都不正确,因为他们建议使用导入路径(SWIFT_INCLUDE_PATHS)。结果,框架二进制文件被锁定到文件系统中的特定位置,并且二进制文件本身不可移植。虽然这不是世界末日,但我仍然希望能够通过 Carthage 分发二进制文件,并且按照上述方法无法实现。
我尝试使用框架的总括头文件创建自己的模块映射,并将 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 文件是一个头文件,如下所示:
#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
这里的问题是,我在尝试编译项目时遇到关于包含非模块化头文件的错误。
我尝试将所有头文件作为公共头文件包含到 XCode 项目中(conf.h、evp.h 等,所有这些)。但是问题仍然存在,大概是因为它无法使用标头包含#include <openssl/conf.h> 的语法。将包含更改为#include "conf.h" 等有效,但随后将相同样式的标题包含用于conf.h 以及来自Open SSL 库的所有其他头文件,因此这并没有真正的帮助。
我真的不想为了让它工作而修改 OpenSSL 库中的每个头文件,似乎必须有一些更简单的方法。
有什么方法可以不必将这些标头包含到 XCode 项目中,以便它们仍然可以使用 #include <openssl/conf.h> 的原始语法?
我尝试将HEADER_SEARCH_PATHS 设置为每个标头的相对路径为openssl/conf.h 等的路径,但它根本没有帮助。
谢谢。
【问题讨论】:
-
您找到解决方案了吗?我尝试在ModuleMap中声明所有头文件,但仍然没有解决导入问题
-
归结为标题包含语法的问题 ->
#include <openssl/conf.h>。正如我在上面的问题中描述的那样,我已经为库中的每个文件将其更改为#include "conf.h"等。我用这个脚本来改变标题:sed -E -i '' 's/#[[:space:]]*include <openssl\/(.*).h>/#include \"\1\.h"/' $SCRIPT_DIR/../Libraries/openssl/include/openssl/*.h -
哇,就是这样。我认为必须有更好的解决方案,但您的脚本在这里真的很有帮助。您可以将此添加为我猜的正确答案。
-
我想是的。很高兴它有帮助。
标签: swift xcode openssl llvm-clang module-map