一、问题描述
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
时,是自己用的不对,检查函数原型和自己用的函数参数是否都匹配