【问题标题】:Can't get libsodium pre-built library for mingw windows to work无法让 mingw windows 工作的 libsodium 预建库
【发布时间】:2018-01-11 03:45:35
【问题描述】:

我想要的是,按照the documentation,只需使用以下代码:

#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 for windows 的文档中,它说明了 MinGW32 的预编译 windows 版本。当我在 MinGW 中使用代码块时,我认为这些应该可以工作。

我下载了libsodium-1.0.13-mingw.tar.gz 文件并将其解压缩。我把libsodium-win32文件夹的所有内容都放在MinGW根C:\Program Files (x86)\CodeBlocks\MinGW中(文件夹includebinlib也匹配,让我相信这是正确的方法)。

然后我使用上面的代码 sn-p 在代码块中创建一个新项目,并使用 -std=c99 进行编译(尽管 -std=gnu99 没有任何区别)并收到以下警告:

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

这表明它由于某种原因找不到或实际上不包含&lt;sodium.h&gt;。奇怪的是,如果我只使用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))

谁能帮我弄清楚如何让钠在我的装置上发挥作用?

【问题讨论】:

  • 您没有链接与实际的库。在 Code::Blocks 的项目设置中的某处应该有一个包含类似设置的选项卡或类似内容。您需要在其中添加实际的库。仅仅包含头文件是不够的。
  • 链接这个库的语法是什么?我似乎在文档中找不到它。

标签: c windows codeblocks mingw32 libsodium


【解决方案1】:

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

【讨论】:

  • 好的,我找到了“链接库”并在其中包含了 .a。我该怎么做1)?如:我在哪里以及如何“精确定位包含文件的位置”?我认为这必须在“其他链接器选项”字段中完成,但我对语法一无所知,似乎无法在网上找到它。现在在构建时,我得到一个 "undefined reference to 'SystemFunction036@8'" ,可能是因为它找到了要链接的函数,但没有找到实际的函数本身或其他东西。
  • 要添加包含文件,您需要将它们添加到项目中(我的左侧选项卡,但可能已经移动了 1 天)。在那里你有你的项目和 2/3 文件夹:源,标题,其他(如果你有 image )你需要在那里添加你的文件。为此,您右键单击它(项目)并添加文件或类似的东西。我不知道你的新错误会在今晚发现。
  • 但这应该是一个基本库,因此我们使用 而不是某种形式的相对路径“sodium.h”。它应该自动包含要构建的文件,因为它应该是(成为)本机 mingw 库。
  • 您好,您是否在您的图书馆尝试过 stackoverflow.com/questions/5862757/…。对于您想要使用 而不是“sodium.h”的问题,这取决于您的文件是在项目文件夹中还是在包含文件夹中。
猜你喜欢
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多