我正在尝试使用实现Paillier加密并在Xcode中使用this库的GMP库。

为此,我下载了两个库并成功构建了它们。然后,在Xcode的项目设置中,将“usr / local / include”添加到“标题搜索路径”,并将“/ usr / local / lib”添加到“库搜索路径”。我还在“其他链接器标志”中添加了“-lgmp”和“-lpaillier”。

我可以毫无问题地包含“gmp.h”和“paillier.h”,并且我也可以使用gmp功能。但是,如果尝试使用paillier功能,则会出现构建错误。

Undefined symbols for architecture x86_64:
  "paillier_keygen(int, paillier_pubkey_t**, paillier_prvkey_t**, void (*)(void*, int))", referenced from:
      DOwner::run() in downer.o
  "paillier_get_rand_devrandom(void*, int)", referenced from:
      DOwner::run() in downer.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我试图通过google找到解决此问题的方法,但没有任何效果。

更新

我将标志“-lpaillier”切换为“-l:libpaillier.a”,并收到以下错误:
ld: library not found for -l:libpaillier.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这很奇怪,因为文件“libpaillier.a”位于/ usr / local / lib中,带有“libgmp.a”,因此如何找到gmp文件而不找到该文件。为了检查Xcode是否正在其他目录中搜索,我运行sudo find / -name "libgmp.a"来查看Xcode是否正在使用它的其他实例,但是/ usr / local / lib中只有一个。

更新

为了确保Xcode链接到库,我转到“构建阶段”>“使用库链接二进制文件”,然后将文件“libpaillier.a”拖到该库中。但是错误仍然存​​在。

更新

我将构成整个源代码的paillier.h和paillier.c文件复制到了我的项目文件夹中。然后,我将paillier.c链接到我的目标项目。问题仍然存在。但是当我将文件重命名为paillier.hpp和paillier.cpp时,因为我的项目是cpp项目,问题得以解决。但是,我收到另一个错误,该错误表明使用库使用的空指针算法是非法的。有没有一种方法可以在Xcode中使用空指针算法?

最佳答案

从第一个错误来看,很可能您正在以32位构建库(我猜您有一些用于构建lib的makefile)和您的应用程序为64位,因此链接程序会找到该库,但找不到您的实现预期的体系结构。

因此,请在Xcode中检查应用程序的项目设置,并将其更改为32位。或者查看是否有构建说明以64位构建库。

07-26 00:45