0

我想要的是,根据文档,只需使用以下代码:

#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;
}

在文档的 windows安装部分,它说明了 MinGW32 的预编译 windows 版本。当我在 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))

有人可以帮我弄清楚如何让钠在我的设置中起作用吗?

4

1 回答 1

0

在代码块上,您必须将库链接到它们所在的位置。1)你必须精确的包含文件在哪里。2)lib文件在哪里(我认为以mgw中的.a结尾)如果我没记错你这样做: Project>Build Option>Linker
更完整的答案在以下帖子中https://stackoverflow.com/a/23050127/7850639

于 2017-08-03T13:51:02.120 回答