fumingxiaoshen 2024-03-27 20:49 采纳率: 50%
浏览 23

CMake报错重定义

下述CMakeList.txt文件

set(_FPTRU_OBJS "")


if(OQS_ENABLE_KEM_fptru_653)
    add_library(fptru_653 OBJECT kem_fptru_653.c fptru_main/poly_mul_n653q/radix_ntt_n653.c fptru_main/cbd.c fptru_main/coding.c fptru_main/cpucycles.c fptru_main/fips202.c fptru_main/inverse.c fptru_main/kem.c fptru_main/pack.c fptru_main/pke.c fptru_main/poly.c fptru_main/randombytes.c fptru_main/reduce.c fptru_main/speed.c) #这里不能够有斜杠
    target_compile_options(fptru_653 PUBLIC -DFPTRU_N=653)
    target_include_directories(fptru_653 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/fptru_main)
    target_include_directories(fptru_653 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/fptru_main/poly_mul_n653q)
    set(_FPTRU_OBJS ${_FPTRU_OBJS} $<TARGET_OBJECTS:fptru_653>)
endif()

if(OQS_ENABLE_KEM_fptru_761)
    add_library(fptru_761 OBJECT kem_fptru_761.c fptru_main/poly_mul_n761q/radix_ntt_n761.c fptru_main/cbd.c fptru_main/coding.c fptru_main/cpucycles.c fptru_main/fips202.c fptru_main/inverse.c fptru_main/kem.c fptru_main/pack.c fptru_main/pke.c fptru_main/poly.c fptru_main/randombytes.c fptru_main/reduce.c fptru_main/speed.c) #这里不能够有斜杠
    target_compile_options(fptru_761 PUBLIC -DFPTRU_N=761)
    target_include_directories(fptru_761 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/fptru_main)
    target_include_directories(fptru_761 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/fptru_main/poly_mul_n761q)
    set(_FPTRU_OBJS ${_FPTRU_OBJS} $<TARGET_OBJECTS:fptru_761>)
endif()

set(FPTRU_OBJS ${_FPTRU_OBJS} PARENT_SCOPE)

在编译过程中报错

/usr/bin/ld: src/kem/fptru/CMakeFiles/fptru_761.dir/fptru_main/fips202.c.o: in function `sha3_256':
fips202.c:(.text.sha3_256+0x0): multiple definition of `sha3_256'; src/kem/fptru/CMakeFiles/fptru_653.dir/fptru_main/fips202.c.o:fips202.c:(.text.sha3_256+0x0): first defined here
/usr/bin/ld: src/kem/fptru/CMakeFiles/fptru_761.dir/fptru_main/fips202.c.o: in function `sha3_512':
fips202.c:(.text.sha3_512+0x0): multiple definition of `sha3_512'; src/kem/fptru/CMakeFiles/fptru_653.dir/fptru_main/fips202.c.o:fips202.c:(.text.sha3_512+0x0): first defined here
/usr/bin/ld: src/kem/fptru/CMakeFiles/fptru_761.dir/fptru_main/inverse.c.o: in function `uint32_divmod_uint14':
inverse.c:(.text.uint32_divmod_uint14+0x0): multiple definition of `uint32_divmod_uint14'; src/kem/fptru/CMakeFiles/fptru_653.dir/fptru_main/inverse.c.o:inverse.c:(.text.uint32_divmod_uint14+0x0): first defined here
/usr/bin/ld: src/kem/fptru/CMakeFiles/fptru_761.dir/fptru_main/inverse.c.o: in function `int32_divmod_uint14':
inverse.c:(.text.int32_divmod_uint14+0x0): multiple definition of `int32_divmod_uint14'; src/kem/fptru/CMakeFiles/fptru_653.dir/fptru_main/inverse.c.o:inverse.c:(.text.int32_divmod_uint14+0x0): first defined here
/usr/bin/ld: src/kem/fptru/CMakeFiles/fptru_761.dir/fptru_main/inverse.c.o: in function `uint32_mod_uint14':
inverse.c:(.text.uint32_mod_uint14+0x0): multiple definition of `uint32_mod_uint14'; src/kem/fptru/CMakeFiles/fptru_653.dir/fptru_main/inverse.c.o:inverse.c:(.text.uint32_mod_uint14+0x0): first defined here

似乎是因为fptru_761何fptru_653重用了相同的代码导致的,我应该如何修改CMakeList.txt文件呢?

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 Java领域优质创作者 2024-03-27 20:49
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据错误提示,可以看出是因为两个库中重复定义了相同的函数而导致了编译错误。为了解决这个问题,我们可以将这些公共函数提取出来单独作为一个库,然后在fptru_653和fptru_761中都引用这个库即可。以下是修改后的CMakeList.txt文件。
    set(_FPTRU_OBJS "")
    # 定义一个公共库
    add_library(common_objs OBJECT
        fptru_main/fips202.c
        fptru_main/inverse.c
    )
    # 声明库fptru_653
    if(OQS_ENABLE_KEM_fptru_653)
        add_library(fptru_653 OBJECT
            kem_fptru_653.c
            fptru_main/poly_mul_n653q/radix_ntt_n653.c
            fptru_main/cbd.c
            fptru_main/coding.c
            fptru_main/cpucycles.c
            fptru_main/inverse.c
            fptru_main/kem.c
            fptru_main/pack.c
            fptru_main/pke.c
            fptru_main/poly.c
            fptru_main/randombytes.c
            fptru_main/reduce.c
            fptru_main/speed.c
        )
        # 引用公共库
        target_link_libraries(fptru_653 PRIVATE common_objs)
        target_compile_options(fptru_653 PUBLIC -DFPTRU_N=653)
        target_include_directories(fptru_653 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/fptru_main)
        target_include_directories(fptru_653 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/fptru_main/poly_mul_n653q)
        set(_FPTRU_OBJS ${_FPTRU_OBJS} $<TARGET_OBJECTS:fptru_653>)
    endif()
    # 声明库fptru_761
    if(OQS_ENABLE_KEM_fptru_761)
        add_library(fptru_761 OBJECT
            kem_fptru_761.c
            fptru_main/poly_mul_n761q/radix_ntt_n761.c
            fptru_main/cbd.c
            fptru_main/coding.c
            fptru_main/cpucycles.c
            fptru_main/inverse.c
            fptru_main/kem.c
            fptru_main/pack.c
            fptru_main/pke.c
            fptru_main/poly.c
            fptru_main/randombytes.c
            fptru_main/reduce.c
            fptru_main/speed.c
        )
        # 引用公共库
        target_link_libraries(fptru_761 PRIVATE common_objs)
        target_compile_options(fptru_761 PUBLIC -DFPTRU_N=761)
        target_include_directories(fptru_761 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/fptru_main)
        target_include_directories(fptru_761 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/fptru_main/poly_mul_n761q)
        set(_FPTRU_OBJS ${_FPTRU_OBJS} $<TARGET_OBJECTS:fptru_761>)
    endif()
    set(FPTRU_OBJS ${_FPTRU_OBJS} PARENT_SCOPE)
    

    在上面的代码中,我们通过add_library命令定义了一个新的库common_objs,将fips202.c和inverse.c文件编译成了该库的对象文件。然后,在定义fptru_653和fptru_761库时,使用target_link_libraries命令将这两个库都链接到common_objs库,从而共享公共代码。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月27日