2017-08-03 82 views
0

我要的是,按照the documentation,只要使用此代碼:無法獲得libsodium預建庫MinGW的窗口工作

#include <sodium.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <inttypes.h> 

int main(void) 
{ 
    if (sodium_init() == -1) { 
     return 1; 
    } 
    printf("Random data: %"PRIu32"\n", randombytes_random()); //returns a uint32_t piece of random data 
    return 0; 
} 

installation section的文檔的窗口,它指出了預編譯的Windows版本爲MinGW32。由於我在MinGW中使用了代碼塊,我認爲這些應該可以工作。

我下載了libsodium-1.0.13-mingw.tar.gz文件並解壓。我將libsodium-win32文件夾的所有內容都放入MinGW根目錄C:\Program Files (x86)\CodeBlocks\MinGW(文件夾include,binlib也匹配,這讓我相信這是正確的方法)。

我再從上面建立一個新的項目與代碼段的代碼塊,並用-std = C99編譯(雖然-std = gnu99不會有所作爲),並得到以下警告:

*filepath*\testsodium\main.c 8 undefined reference to 'sodium_init' 
*filepath*\testsodium\main.c 11 undefined reference to 'randombytes_random' 

這表明它出於某種原因找不到或實際上不包含<sodium.h>。有什麼奇怪的是,如果我只是把sodium_init()(不檢查一個if語句的輸出),它給了我一個警告,指出:

*filepath*\testsodium\main.c 8  warning: ignoring return value of 'sodium_init', declared with attribute warn_unused_result [-Wunused-result] 

這表明,我認爲它實際上被解析,因爲它注意到缺乏檢查結果。檢查生成日誌我發現mingw32-gcc.exe拋出-Wunused-result警告,而mingw32-g++拋出錯誤。

-------------- Build: Debug in testsodium (compiler: GNU GCC Compiler)--------------- 

mingw32-gcc.exe -Wall -g -Wall -std=c99 -c 
*filepath*\testsodium\main.c -o obj\Debug\main.o 
*filepath*\testsodium\main.c: In function 'main': 
*filepath*\testsodium\main.c:8:5: warning: ignoring return value of 'sodium_init', declared with attribute warn_unused_result [-Wunused-result] 
sodium_init(); 
^ 
mingw32-g++.exe -o bin\Debug\testsodium.exe obj\Debug\main.o 
obj\Debug\main.o: In function `main': 

*filepath*/testsodium/main.c:8: undefined reference to `sodium_init' 
*filepath*/testsodium/main.c:9: undefined reference to `sodium_init' 
*filepath*/testsodium/main.c:12: undefined reference to `randombytes_random' 
collect2.exe: error: ld returned 1 exit status 
Process terminated with status 1 (0 minute(s), 0 second(s)) 
4 error(s), 1 warning(s) (0 minute(s), 0 second(s)) 

有人可以幫我找出如何讓鈉對我的設置工作?

+1

你不*鏈接*與實際庫。在Code :: Blocks的項目設置中,應該有一個包含liker設置的選項卡或類似選項。在它你需要添加實際的庫。只包括頭文件是不夠的。 –

+0

連接這個庫的語法是什麼?我似乎無法在文檔中找到它。 – realbananas

回答

0

在代碼塊中,您必須將庫連接到哪裏。 1)您必須確定包含文件在哪裏。 2)如果是的lib文件(.A在MGW結束,我認爲) 如果我沒記錯的話,你這樣做,在: Project>Build Option>Linker
一個更完整的答案是在下面的帖子https://stackoverflow.com/a/23050127/7850639

+0

好的,我找到了「鏈接庫」,並在其中包含了.a。我怎麼做1)?如:在哪裏以及如何「精確確定包含文件的位置」? 我認爲這必須在「其他鏈接器選項」字段中完成,但我不知道該語法,並且似乎無法在線找到它。 現在,當我建立一個「未定義的引用'SystemFunction036 @ 8'」,可能是因爲它找到了功能鏈接,但不是實際的功能本身或東西。 – realbananas

+0

要添加包含文件,您需要將它們添加到項目中(左側的選項卡對我來說可能已移動了1天)。你有你的項目和2/3文件夾:源代碼,標題,其他(如果你有圖片),你需要在那裏添加你的文件。要做到這一點,你右鍵點擊它(項目),並添加文件或類似的東西。我不知道你的新錯誤會在今天晚上發現。 –

+0

但是這應該是一個基本的庫,因此我們使用而不是某種形式的相對路徑「sodium.h」。它應該自動包含要構建的文件,因爲它應該是(成爲)本地mingw庫。 – realbananas