2015-11-07 43 views
3

我正在开发OSX/iOS的Swift框架。我需要生成RSA密钥并导出它们,并且安全框架不允许在iOS上完成此操作,所以我将使用OpenSSL。创建OpenSSL框架时某些体系结构的未定义符号

我检索了一个为两个平台构建OpenSSL的脚本(https://gist.github.com/6710405)。它完美地工作,并产生libcrypto.a,libssl.a和每个平台的相应标题。

我想将OpenSSL放入其自己的框架中,并定义一个模块以便在Swift中轻松使用它。

为了简单起见,我们仅限于OSX。我创建了一个名为OpenSSL的新框架项目。我链接了两个库并添加了所有头文件(作为公共头文件)。我还添加了“复制文件”阶段,在这里我复制并签署了两个库。我创建了一个.modulemap文件:

framework module OpenSSL { 

    header "rc2.h" 
    header "rc4.h" 

    header "aes.h" 
    […] 
    header "x509v3.h" 

    header "dtls1.h" 

    export * 
} 

所有的OpenSSL头上市。我原本按字母顺序排列标题,但一些#undef导致问题,所以我不得不重新排序几个标题,它编译(我不喜欢那个!)。

回到原来的框架,我说我的OpenSSL的框架,进口OpenSSL的模块,并写了几行字:

import OpenSSL 

func generateKeyPair() -> RSAKeyPair? { 
    var exponent = BN_new(); 
    BN_set_word(exponent, 65537); 
    var rsa = RSA_new() 
    RSA_generate_key_ex(rsa, 2048, exponent, nil) 
    […] 
} 

代码由Xcode的它认为模块的头完成。当我尝试编译时,它会为一些(但不是全部)OpenSSL的调用生成一些Undefined symbols for architecture x86_64:。例如,它对RSA_generate_key_ex进行了投诉,但对于​​或RSA_new()(在RSA_generate_key_ex之前声明了几行)不是。它不会仅仅因为RSA_generate_key_ex而失败,并且稍后一些其他呼叫也会失败并出现相同的错误。

我已经设置了一个操场来检查这个。一些拨打RSA_new()的电话正在返还东西,但操场无法找到RSA_generate_key_ex的符号。

我快速建立了一个新的Objective-C项目,添加了libs和头文件的经典方式和相同的代码(在ObjC中)编译和运行没有问题。因此,我确信这些库是用所有需要的体系结构构建的(并且我使用otool进行了检查)。

我的框架出了问题。我试图删除/添加“复制文件”阶段没有成功。我对我制作.modulemap文件的方式并不满意,但我不知道它会在哪里引起此类问题。我不是框架制作方面的专家,所以也许有人知道会发生什么,以及如何解决它?

+1

*“...当我尝试编译时,它会为架构x86_64生成一些未定义的符号...”*。这是一个链接器消息,而不是编译器消息。 – jww

回答

2

我自己找到了解决方案。像往常一样,框架中需要使用旧的-all_load标志作为“其他链接器标志”。

此外,库的复制阶段不需要。链接它们似乎已经足够了。

相关问题