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.h
、evp.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
我正在尝试 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.h
、evp.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