2016-10-06 107 views
1

我試圖使用實現Paillier加密的this庫,並在Xcode中使用GMP庫。C C++在Xcode中建立鏈接器錯誤

要做到這一點,我下載了兩個庫併成功構建它們。然後,我在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) 

我試圖通過谷歌找到這個問題的解決方案,但沒有發現工作。

UPDATE

我換旗 「-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。一個「在/ usr/local/lib中,並帶有」libgmp.a「,所以它怎麼能找到gmp文件,但不是這個。要檢查Xcode是否在另一個目錄中搜索,我運行sudo find/-name "libgmp.a"以查看Xcode可能正在使用的其他任何實例,但在/ usr/local/lib中只有一個實例。

UPDATE

爲了確保Xcode的鏈接,我去了「構建階段」庫>「鏈接的二進制,庫」,並拖累文件「libpaillier.a」給它。但錯誤仍然存​​在。

UPDATE

我複製了構成整個源代碼到我的項目文件夾中的paillier.h和paillier.c文件。然後我將paillier.c鏈接到我的目標項目。問題依然存在。但是,當我將這些文件重命名爲paillier.hpp和paillier.cpp,因爲我的項目是一個cpp項目,問題就解決了。但是,我得到另一個錯誤,說它有非法使用該庫使用的void指針算術。有沒有辦法讓Xcode中的void指針算術?

回答

0

終於解決了它,而是繞過它。

下面是我所採取的步驟:

  1. 相反進口libpaillier作爲圖書館的我包括在我的項目的源文件。
  2. 我將擴展名重命名爲hpp和cpp,因爲編譯器有其他問題。
  3. 我用在算術中用於char *的空指針替換每個實例。
  4. 如果需要,我將一些無效指針轉換爲char指針。

雖然這可能不是最優雅的解決方案,但它的工作原理,我找不到另一種方式。

0

從第一個錯誤判斷,最有可能是你爲32位構建了庫(我猜你有一些用於構建庫的makefile)和你的應用程序爲64位,所以鏈接器找到庫,但沒有找到爲您的預期架構實施。

因此,在Xcode中檢查您的項目設置並將其更改爲32位。或者看看是否有構建指令來構建64位的庫。

+0

我試過,但我收到'未定義的符號爲架構i386'所以我不認爲這是問題 – user1546022