【已解决】The plain signature for target_link_libraries has already been used with the target “run_imag

一、问题描述

cmake时报错

CMake Error at example/CMakeLists.txt:74 (target_link_libraries):
  The plain signature for target_link_libraries has already been used with
  the target "run_image_slam".  All uses of target_link_libraries with a
  target must be either all-keyword or all-plain.

  The uses of the plain signature are here:

   * /opt/cmake-3.19.1/share/cmake-3.19/Modules/FindCUDA.cmake:1903 (target_link_libraries)

出错的cmakelist代码处

foreach(EXECUTABLE_TARGET IN LISTS EXECUTABLE_TARGETS)
    # Set output directory for executables
    set_target_properties(${EXECUTABLE_TARGET} PROPERTIES
                          RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}"
                          RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}"
                          RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${PROJECT_BINARY_DIR}"
                          RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${PROJECT_BINARY_DIR}")

    #  if(USE_CUDASIFT)
    #         target_compile_definitions(${EXECUTABLE_TARGET} PRIVATE USE_CUDASIFT)
    #         target_link_libraries(${EXECUTABLE_TARGET} PRIVATE cudasift)#引入cudasift库
    # endif()
    # PangolinViewer is used on a priority basis
    if(USE_PANGOLIN_VIEWER)
        # Set macro flag
        target_compile_definitions(${EXECUTABLE_TARGET} PRIVATE USE_PANGOLIN_VIEWER)
        # Link viewer
        target_link_libraries(${EXECUTABLE_TARGET} PRIVATE pangolin_viewer)
    elseif(USE_SOCKET_PUBLISHER)
        # Set macro flag
        target_compile_definitions(${EXECUTABLE_TARGET} PRIVATE USE_SOCKET_PUBLISHER)
        # Link viewer
        target_link_libraries(${EXECUTABLE_TARGET} PRIVATE socket_publisher)
    endif()

    # Setup stack trace logger
    if(USE_STACK_TRACE_LOGGER)
        target_compile_definitions(${EXECUTABLE_TARGET} PRIVATE USE_STACK_TRACE_LOGGER)
        target_link_libraries(${EXECUTABLE_TARGET} PRIVATE ${GLOG_LIBRARIES})
    endif()

    # Setup google-perftools
    if(USE_GOOGLE_PERFTOOLS)
        target_compile_definitions(${EXECUTABLE_TARGET} PRIVATE USE_GOOGLE_PERFTOOLS)
        target_link_libraries(${EXECUTABLE_TARGET} PRIVATE ${GPERFTOOLS_LIBRARIES})
    endif()

    # Link OpenVSLAM
    target_link_libraries(${EXECUTABLE_TARGET}
                          PRIVATE
                          ${PROJECT_NAME}
                          opencv_imgcodecs
                          opencv_videoio
                          ${CUDA_cudadevrt_LIBRARY}
                          )
    #  LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/build1/lib/cudasift)
    # include popl and spdlog headers
    target_include_directories(${EXECUTABLE_TARGET}
                               PRIVATE
                               $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/3rd/popl/include>
                               $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/3rd/spdlog/include>)
endforeach()

1.2解决方法

将上述代码中的所有private都删除

二、新的问题

2.1问题描述

CMake Error at example/CMakeLists.txt:72 (target_compile_definitions):
  target_compile_definitions called with invalid arguments

CMake Error at example/CMakeLists.txt:103 (target_include_directories):
  target_include_directories called with invalid arguments

CMake Error at example/CMakeLists.txt:72 (target_compile_definitions):
  target_compile_definitions called with invalid arguments

CMake Error at example/CMakeLists.txt:103 (target_include_directories):
  target_include_directories called with invalid arguments

CMake Error at example/CMakeLists.txt:72 (target_compile_definitions):
  target_compile_definitions called with invalid arguments

CMake Error at example/CMakeLists.txt:103 (target_include_directories):
  target_include_directories called with invalid arguments

2.2 问题解决

出现上述错误的原因在于target_compile_definitions与target_include_directories函数需要指定type–<INTERFACE|PUBLIC|PRIVATE>

target_include_directories(<target> [SYSTEM] [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE>
[items2...] ...])

在target_compile_definition和target_include_directories函数中加入类型,如下所示

target_compile_definitions(${EXECUTABLE_TARGET} PUBLIC USE_PANGOLIN_VIEWER)#加入了PUBLIC
    target_include_directories(${EXECUTABLE_TARGET}
                               PUBLIC#加上这句
                               $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/3rd/popl/include>
                               $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/3rd/spdlog/include>)
                               

三、总结

1.显示The plain signature for target_link_libraries has already been used with the target "run_image_slam". All uses of target_link_libraries with a target must be either all-keyword or all-plain.时,将target_link_libraries函数中的<INTERFACE|PUBLIC|PRIVATE>删掉
2.显示called with invalid arguments时,是自己用的不对,检查函数原型和自己用的函数参数是否都匹配

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值