我正在尝试使用XCode将OpenSSL库静态链接到我的Swift框架。在线提到的大多数方法都不正确,因为它们建议使用导入路径(SWIFT_INCLUDE_PATHS
)。结果,框架二进制文件被锁定到文件系统中的特定位置,并且二进制文件本身不可移植。尽管这还不是世界末日,但我仍然希望能够例如通过Carthage分发二进制文件,并且遵循上述方法不能启用它。
我已尝试使用框架的伞形头文件创建自己的模块映射,并使用OpenSSL库作为显式模块,具体方法如下:https://badootech.badoo.com/bundling-c-library-in-swift-framework-3d9dae950774
这是我的modulemap文件,我将其插入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
这里的问题是,在尝试编译有关包含非模块化标头的项目时出现错误。
我试图将所有的头文件作为公共头文件(conf.h
,evp.h
等都包含在XCode项目中)。但是问题仍然存在,大概是因为它无法使用标头包含#include <openssl/conf.h>
的语法。将包含更改为#include "conf.h"
等是可行的,但是conf.h
和来自Open SSL库的所有其他头文件使用了相同的标头包含样式,因此这实际上没有帮助。
我真的不想仅仅为了使它起作用而修改OpenSSL库中的每个头文件,似乎必须有一些更简便的方法。
有没有办法不必将这些标头包含在XCode项目中,以便它们仍可以与#include <openssl/conf.h>
的原始语法一起使用?
我尝试将HEADER_SEARCH_PATHS
设置为一个路径,从该路径到每个标头的相对路径为openssl/conf.h
等,但这根本没有帮助。
谢谢。
答案 0 :(得分:1)
最后,除了将所有必要的标头列出到模块映射中并将SSL库文件的include宏从<>
语法重写为普通include之外,我找不到更好的解决方案。我使用了这个小shell脚本来帮助我:
sed -E -i '' 's/#[[:space:]]*include <openssl\/(.*).h>/#include \"\1\.h"/' $SCRIPT_DIR/../Libraries/openssl/include/openssl/*.h
答案 1 :(得分:0)
您可以发送带有错误的构建日志吗?
您正在使用哪个版本的OpenSSL库?
您可以尝试使用https://github.com/krzyzanowskim/OpenSSL吗?他对非模块化标头没有任何错误