C\C++ Xcode 中的构建链接器错误

C\C++ build linker error in Xcode

我正在尝试使用 Xcode 中的 this library that implements Paillier encryption and uses the GMP 库。

为此,我下载了两个库并成功构建了它们。然后我在Xcode中的项目设置中将"usr/local/include"添加到"Header Search Paths"并将“/usr/local/lib”添加到"Library Search Paths"。我还在 "Other Linker Flags".

中添加了“-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)

这是 st运行ge,因为文件 "libpaillier.a" 在 /usr/local/lib 和 "libgmp.a" 中,所以它怎么能找到 gmp 文件而不是这个文件。为了检查 Xcode 是否在不同的目录中搜索,我 运行 sudo find / -name "libgmp.a" 看看是否有 Xcode 可能正在使用的任何其他实例,但只有一个在 /usr/local/lib.

更新

为了确保 Xcode 链接到库,我转到 "Build Phases" > "Link Binary With Library" 并将文件 "libpaillier.a" 拖到它。但错误仍然存​​在。

更新

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

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

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

终于解决了它,或者更确切地说绕过了它。

以下是我采取的步骤:

  1. 我没有将 libpaillier 作为库导入,而是将源文件包含在我的项目中。
  2. 我将扩展重命名为 hpp 和 cpp,因为否则编译器会出现问题。
  3. 我用一个空指针替换了每个实例,该指针在算术中用于 char *。
  4. 如果需要,我将一些 void 指针转换为 char 指针。

虽然这可能不是最优雅的解决方案,但它确实有效,我找不到其他方法。