将Modulemap用于Swift框架时,OpenSSL库的非模块化标头

时间:2019-06-14 14:05:57

标签: swift xcode openssl llvm-clang module-map

我正在尝试使用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.hevp.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等,但这根本没有帮助。

谢谢。

2 个答案:

答案 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吗?他对非模块化标头没有任何错误