【问题标题】:Using Keccak Library in a C++ project在 C++ 项目中使用 Keccak 库
【发布时间】:2018-03-10 12:24:15
【问题描述】:

我正在尝试在项目中使用Keccak Code Package,尤其是 SHAKE128 可扩展输出哈希函数。我按照他们的指示编译了这个库,得到了两个文件夹,一个是libkeccak.a,里面是.o文件,另一个是 libkeccak.a.headers,里面全是.h

现在我的项目结构如下:

Project 
 |
 + -- MakeFile
 |
 + -- Lamport 
 |     |
 |     + -- lamportOTS.cpp
 |     
 + --libkeccak.a
 |     |
 |     + -- *.o
 |
 + -- libkeccak.a.headers
 |     |
 |     + -- *.h

我要使用的函数在 libkeccak.a.headers/SimpleFIPS202.h 中指定。因此我已经包含了头文件。但是我找不到如何正确编译它。我试过了:

 g++ -c Lamport/lamportOTS.cpp 
 g++ lamportOTS.o libkeccak.a/SImpleFIPS202.o

它找到了 SHAKE128 函数,但编译失败,因为不同的 .o 文件似乎是相互依赖的。这是lampOTS.cpp的草图

#include "../libkeccak.a.headers/SimpleFIPS202.h"

void sign(unsigned char* message, unsigned char* signature, unsigned char*** key){

    unsigned char randombits[2][256][32];

    ...

    /* Apply SHAKE128 to each value */
    for(int i = 0; i != 2; i++){
            for(int j = 0; j!= 256;j++){
                    SHAKE128(key[i][j],32, randombits[i][j], 32);
            }
    }

}

编辑: cmets 中已询问有关编译错误的详细信息。运行

g++ lamportOTS.o libkeccak.a/SimpleFIPS202.o

出现以下错误

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: dans la fonction « _start »:
(.text+0x20): référence indéfinie vers « main »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHAKE128 »:
SimpleFIPS202.c:(.text+0x19): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHAKE256 »:
SimpleFIPS202.c:(.text+0x49): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHA3_224 »:
SimpleFIPS202.c:(.text+0x80): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHA3_256 »:
SimpleFIPS202.c:(.text+0xb0): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHA3_384 »:
SimpleFIPS202.c:(.text+0xe0): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o:SimpleFIPS202.c:(.text+0x110): encore plus de références indéfinies suivent vers « KeccakWidth1600_Sponge »
lamportOTS.o: dans la fonction « sign(unsigned char*, unsigned char*, unsigned char***) »:
lamportOTS.cpp:(.text+0x140): référence indéfinie vers « SHAKE128(unsigned char*, unsigned long, unsigned char const*, unsigned long) »
collect2: error: ld returned 1 exit status

【问题讨论】:

  • 没有名为libkeccak.a文件吗?因为似乎该库正在尝试创建一个实际的静态库(即名为 libkeccak.a 的文件),然后您可以链接整个库而不是其单独的目标文件。
  • 我已经克隆了Keccak repo 并按照说明进行操作,但并没有真正提及如何使用该库。还有一个libkeccak.a.target 文件,但似乎无关紧要。
  • 编译器打印错误消息而不是返回简单的通过/失败代码是有原因的。
  • 当我运行 g++ lamportOTS.o libkeccak.a/SimpleFIPS202.o 时,我得到 (.text+0x20): référence indéfinie vers « main » libkeccak.a/SimpleFIPS202.o: dans la fonction « SHAKE128 »: SimpleFIPS202.c:(.text+0x19): référence indéfinie vers « KeccakWidth1600_Sponge » 我也可以链接 KeccakWidth1600_Sponge.o 但是有超过 30 个文件,我真的不想进入那个。
  • 如果没有创建实际的静态库(你到处搜索过?)那么你可能想自己做。通过修改库 makefile 以自动创建库作为其构建过程的一部分,或者手动(可能作为 your 构建过程的一部分?)。要么这样,要么与所需的每个目标文件链接。

标签: c++ compilation keccak


【解决方案1】:

终于成功了。只是为了记录,这是我必须做的:

  • 查找 .a 文件而不是文件夹
  • 如下包装包含,因为该库是用 C 编写的 extern "C" {#include "libkeccak.a.headers/SimpleFIPS202.h"}
  • 运行 g++ Lamport/lamportOTS.cpp -o Lamport/lamportOTS -L[folder containing libkeccak.a] -lkeccak(顺序似乎很重要)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多