0

プロジェクトでKeccak コード パッケージ、特に SHAKE128 拡張可能な出力ハッシュ関数を使用しようとしています。彼らの指示に従ってライブラリをコンパイルし、2 つのフォルダーを取得しました。1 つはlibkeccak.a.oファイルでいっぱいです。

現在、私のプロジェクトの構造は次のようになっています。

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ファイルが相互に依存しているように見えるため、コンパイルに失敗します。これがlamportOTS.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);
            }
    }

}

編集: コンパイル エラーの詳細については、コメントで質問されています。ランニング

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
4

1 に答える 1

0

それはついに働いた。記録のために、これが私がしなければならなかったことです:

  • フォルダーの代わりに.aファイルを探す
  • ライブラリは C で記述されているため、インクルードを次のようにラップします。 extern "C" {#include "libkeccak.a.headers/SimpleFIPS202.h"}
  • 実行 g++ Lamport/lamportOTS.cpp -o Lamport/lamportOTS -L[folder containing libkeccak.a] -lkeccak(順序は重要なようです)
于 2018-03-10T14:46:16.710 に答える