宏定义的函数 - 编译错误

Macro Defined Functions - Compiling Error

提问人:Kanije Ashine Shie Shuai 提问时间:8/20/2023 最后编辑:jpsKanije Ashine Shie Shuai 更新时间:8/20/2023 访问量:58

问:

我正在尝试编译和创建 dilithium2 算法的可执行文件,这是一个量子密码学项目。我在编译过程中使用宏定义函数时遇到了麻烦。即使函数是用宏定义的,我也收到错误未定义的引用。你能帮我使用宏函数的诀窍是什么吗?

您可以从美国国家标准与技术研究院获得开源文件。 链接:来自NIST官方网站的开源代码。您可以下载 CRYSTAL-DILITHIUM。

以下是我的详细信息:

编译输出和相关错误:

====================[ Build | dilithium_test_speed | Debug ]====================
/opt/clion-2023.1.4/bin/cmake/linux/x64/bin/cmake --build /projectDirectory/cmake-build-debug --target dilithium_test_speed -j 10
[2/2] Linking C executable dilithium_test_speed
FAILED: dilithium_test_speed 
: && /usr/bin/cc -g  CMakeFiles/dilithium_test_speed.dir/test/cpucycles.c.o CMakeFiles/dilithium_test_speed.dir/test/speed_print.c.o CMakeFiles/dilithium_test_speed.dir/test/test_dilithium.c.o CMakeFiles/dilithium_test_speed.dir/randombytes.c.o CMakeFiles/dilithium_test_speed.dir/sign.c.o CMakeFiles/dilithium_test_speed.dir/poly.c.o CMakeFiles/dilithium_test_speed.dir/polyvec.c.o -o dilithium_test_speed  -lcrypto  -lssl && :
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/sign.c.o: in function `pqcrystals_dilithium2_ref_keypair':
/projectDirectory/sign.c:33: undefined reference to `pqcrystals_fips202_ref_shake256'
/usr/bin/ld: /projectDirectory/sign.c:58: undefined reference to `pqcrystals_dilithium2_ref_pack_pk'
/usr/bin/ld: /projectDirectory/sign.c:61: undefined reference to `pqcrystals_fips202_ref_shake256'
/usr/bin/ld: /projectDirectory/sign.c:62: undefined reference to `pqcrystals_dilithium2_ref_pack_sk'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/sign.c.o: in function `pqcrystals_dilithium2_ref_signature':
/projectDirectory/sign.c:100: undefined reference to `pqcrystals_dilithium2_ref_upack_sk'
/usr/bin/ld: /projectDirectory/sign.c:103: undefined reference to `pqcrystals_fips202_ref_shake256_init'
/usr/bin/ld: /projectDirectory/sign.c:104: undefined reference to `pqcrystals_fips202_ref_shake256_absorb'
/usr/bin/ld: /projectDirectory/sign.c:105: undefined reference to `pqcrystals_fips202_ref_shake256_absorb'
/usr/bin/ld: /projectDirectory/sign.c:106: undefined reference to `pqcrystals_fips202_ref_shake256_finalize'
/usr/bin/ld: /projectDirectory/sign.c:107: undefined reference to `pqcrystals_fips202_ref_shake256_squeeze'
/usr/bin/ld: /projectDirectory/sign.c:112: undefined reference to `pqcrystals_fips202_ref_shake256'
/usr/bin/ld: /projectDirectory/sign.c:137: undefined reference to `pqcrystals_fips202_ref_shake256_init'
/usr/bin/ld: /projectDirectory/sign.c:138: undefined reference to `pqcrystals_fips202_ref_shake256_absorb'
/usr/bin/ld: /projectDirectory/sign.c:139: undefined reference to `pqcrystals_fips202_ref_shake256_absorb'
/usr/bin/ld: /projectDirectory/sign.c:140: undefined reference to `pqcrystals_fips202_ref_shake256_finalize'
/usr/bin/ld: /projectDirectory/sign.c:141: undefined reference to `pqcrystals_fips202_ref_shake256_squeeze'
/usr/bin/ld: /projectDirectory/sign.c:176: undefined reference to `pqcrystals_dilithium2_ref_pack_sig'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/sign.c.o: in function `pqcrystals_dilithium2_ref_verify':
/projectDirectory/sign.c:245: undefined reference to `pqcrystals_dilithium2_ref_unpack_pk'
/usr/bin/ld: /projectDirectory/sign.c:246: undefined reference to `pqcrystals_dilithium2_ref_unpack_sig'
/usr/bin/ld: /projectDirectory/sign.c:252: undefined reference to `pqcrystals_fips202_ref_shake256'
/usr/bin/ld: /projectDirectory/sign.c:253: undefined reference to `pqcrystals_fips202_ref_shake256_init'
/usr/bin/ld: /projectDirectory/sign.c:254: undefined reference to `pqcrystals_fips202_ref_shake256_absorb'
/usr/bin/ld: /projectDirectory/sign.c:255: undefined reference to `pqcrystals_fips202_ref_shake256_absorb'
/usr/bin/ld: /projectDirectory/sign.c:256: undefined reference to `pqcrystals_fips202_ref_shake256_finalize'
/usr/bin/ld: /projectDirectory/sign.c:257: undefined reference to `pqcrystals_fips202_ref_shake256_squeeze'
/usr/bin/ld: /projectDirectory/sign.c:281: undefined reference to `pqcrystals_fips202_ref_shake256_init'
/usr/bin/ld: /projectDirectory/sign.c:282: undefined reference to `pqcrystals_fips202_ref_shake256_absorb'
/usr/bin/ld: /projectDirectory/sign.c:283: undefined reference to `pqcrystals_fips202_ref_shake256_absorb'
/usr/bin/ld: /projectDirectory/sign.c:284: undefined reference to `pqcrystals_fips202_ref_shake256_finalize'
/usr/bin/ld: /projectDirectory/sign.c:285: undefined reference to `pqcrystals_fips202_ref_shake256_squeeze'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_reduce':
/projectDirectory/poly.c:33: undefined reference to `pqcrystals_dilithium2_ref_reduce32'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_caddq':
/projectDirectory/poly.c:51: undefined reference to `pqcrystals_dilithium2_ref_caddq'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_freeze':
/projectDirectory/poly.c:69: undefined reference to `pqcrystals_dilithium2_ref_freeze'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_ntt':
/projectDirectory/poly.c:143: undefined reference to `pqcrystals_dilithium2_ref_ntt'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_invntt_tomont':
/projectDirectory/poly.c:160: undefined reference to `pqcrystals_dilithium2_ref_invntt_tomont'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_pointwise_montgomery':
/projectDirectory/poly.c:181: undefined reference to `pqcrystals_dilithium2_ref_montgomery_reduce'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_power2round':
/projectDirectory/poly.c:203: undefined reference to `pqcrystals_dilithium2_ref_power2round'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_decompose':
/projectDirectory/poly.c:226: undefined reference to `pqcrystals_dilithium2_ref_decompose'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_make_hint':
/projectDirectory/poly.c:249: undefined reference to `pqcrystals_dilithium2_ref_make_hint'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_use_hint':
/projectDirectory/poly.c:271: undefined reference to `pqcrystals_dilithium2_ref_use_hint'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_uniform':
/projectDirectory/poly.c:372: undefined reference to `pqcrystals_dilithium2_ref_dilithium_shake128_stream_init'
/usr/bin/ld: /projectDirectory/poly.c:373: undefined reference to `pqcrystals_fips202_ref_shake128_squeezeblocks'
/usr/bin/ld: /projectDirectory/poly.c:382: undefined reference to `pqcrystals_fips202_ref_shake128_squeezeblocks'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_uniform_eta':
/projectDirectory/poly.c:462: undefined reference to `pqcrystals_dilithium2_ref_dilithium_shake128_stream_init'
/usr/bin/ld: /projectDirectory/poly.c:463: undefined reference to `pqcrystals_fips202_ref_shake128_squeezeblocks'
/usr/bin/ld: /projectDirectory/poly.c:468: undefined reference to `pqcrystals_fips202_ref_shake128_squeezeblocks'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_uniform_gamma1':
/projectDirectory/poly.c:496: undefined reference to `pqcrystals_dilithium2_ref_dilithium_shake256_stream_init'
/usr/bin/ld: /projectDirectory/poly.c:497: undefined reference to `pqcrystals_fips202_ref_shake256_squeezeblocks'
/usr/bin/ld: CMakeFiles/dilithium_test_speed.dir/poly.c.o: in function `pqcrystals_dilithium2_ref_poly_challenge':
/projectDirectory/poly.c:517: undefined reference to `pqcrystals_fips202_ref_shake256_init'
/usr/bin/ld: /projectDirectory/poly.c:518: undefined reference to `pqcrystals_fips202_ref_shake256_absorb'
/usr/bin/ld: /projectDirectory/poly.c:519: undefined reference to `pqcrystals_fips202_ref_shake256_finalize'
/usr/bin/ld: /projectDirectory/poly.c:520: undefined reference to `pqcrystals_fips202_ref_shake256_squeezeblocks'
/usr/bin/ld: /projectDirectory/poly.c:532: undefined reference to `pqcrystals_fips202_ref_shake256_squeezeblocks'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

文件结构:

  ├── test
  │     ├── cpucycles.c
  │     ├── cpucycles.h
  │     ├── speed_print.c
  │     ├── speed_print.h
  │     ├── test_dilithium.c
  │     ├── test_mul.c
  │     ├── test_speed.c
  │     └── test_vectors.c
  ├── aes256ctr.c
  ├── aes256ctr.h
  ├── api.h
  ├── config.h
  ├── fips202.c
  ├── fips202.h
  ├── ntt.c
  ├── ntt.h
  ├── packing.c
  ├── packing.h
  ├── params.h
  ├── poly.c
  ├── poly.h
  ├── polyvec.c
  ├── PQCgenKAT_sign.c
  ├── randombytes.c
  ├── randombytes.h
  ├── reduce.c
  ├── reduce.h
  ├── rng.c
  ├── rng.h
  ├── rounding.c
  ├── rounding.h
  ├── sign.c
  ├── sign.h
  ├── symmetric.h
  ├── symmetric-aes.c
  ├── symmetric-shake.c
  ├── Makefile
  ├── CMakelists.txt

CMakeLists.txt :

cmake_minimum_required(VERSION 3.12)
project(dilithium2 C)

set(CMAKE_C_STANDARD 11)

# Add your source files here
set(SOURCES
    aes256ctr.c
    fips202.c
    ntt.c
    packing.c
    poly.c
    polyvec.c
    PQCgenKAT_sign.c
    randombytes.c
    reduce.c
    rng.c
    rounding.c
    sign.c
    symmetric-aes.c
    symmetric-shake.c
)

# Add your test source files here
set(TEST_SOURCES
    test/cpucycles.c
    test/speed_print.c
    test/test_dilithium.c
    sign.c
    poly.c
    polyvec.c
)

# Add include directories
include_directories(
    .
    test
)

add_executable(dilithium_test_speed ${TEST_SOURCES})

# Link any necessary libraries (e.g., -lcrypto -lssl)
target_link_libraries(dilithium_test_speed crypto ssl)
C 算法 安全 后量子密码学

评论

0赞 Some programmer dude 8/20/2023
你得到的错误都是链接器错误。如果你学过 C,你应该知道构建一个 C 程序是分多个步骤完成的。一个步骤是将源文件及其包含的所有头文件编译为目标文件(这是编译器使用的转换单元)。然后,链接器采用所有对象文件和所有库来创建最终的可执行程序文件。宏是编译时功能,它们不存在于目标文件中。因此,您遇到的问题与宏无关。
0赞 Some programmer dude 8/20/2023
更有可能的问题是您缺少对象文件,或者没有与所需的库链接。
1赞 Tom Karzes 8/20/2023
正在发生以下两种情况之一:(1) 您没有与定义缺失函数的文件链接,或者 (2) 您打算定义这些函数的文件实际上没有定义它们。所以,选择一个。查找。什么文件定义了它?确认:它是否在文件中?如果没有,那么你已经找到了你的问题。或者,如果它被定义了,那么你在链接可执行文件时忘记包含它,所以只需添加它。pqcrystals_fips202_ref_shake256.o
0赞 Kanije Ashine Shie Shuai 8/20/2023
@Someprogrammerdude非常感谢您的信息反馈,诊断非常匹配。
0赞 Kanije Ashine Shie Shuai 8/20/2023
它与您的诊断@TomKarzes非常匹配。非常感谢。

答: 暂无答案