使用错误数量的参数调用 CMake 设置目标属性
Posted
技术标签:
【中文标题】使用错误数量的参数调用 CMake 设置目标属性【英文标题】:CMake set target properties called with incorrect number of arguments 【发布时间】:2020-03-29 19:32:26 【问题描述】:我正在尝试在我的项目中使用 OpenCV 库,但在运行时出现此错误:
构建命令失败。执行过程时出错 D:\Sdk\cmake\3.6.4111459\bin\cmake.exe 带参数 -HC:\Users\Mouad AITALI\androidStudioProjects\BGREMOVER\app -BC:\Users\Mouad AITALI\AndroidStudioProjects\BGREMOVER\app.cxx\cmake\debug\arm64-v8a -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-16 -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=C:\Users\Mouad AITALI\AndroidStudioProjects\BGREMOVER\app\build\intermediates\cmake\debug\obj\arm64-v8a -DCMAKE_BUILD_TYPE=调试 -DANDROID_NDK=D:\Sdk\ndk\19.2.5345600 -DCMAKE_CXX_FLAGS=-std=c++11 -DCMAKE_TOOLCHAIN_FILE=D:\Sdk\ndk\19.2.5345600\build\cmake\android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=D:\Sdk\cmake\3.6.4111459\bin\ninja.exe -GAndroid Gradle - Ninja -- 配置不完整,出现错误!另请参阅“C:/Users/Mouad AITALI/AndroidStudioProjects/BGREMOVER/app/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeOutput.log”。
CMakeLists.txt:13 (set_target_properties) 处的 CMake 错误: 使用错误数量的参数调用 set_target_properties。
CMakeLists.txt
#declare folder path
set(pathToProject C:\\Users\\Mouad;AITALI\\AndroidStudioProjects\\BGREMOVER)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=gnu++11")
include_directories($pathToOpenCv/sdk/native/jni/include)
#library location
add_library(lib_opencv SHARED IMPORTED)
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION $pathToProject/app/src/main/jniLibs/$ANDROID_ABI/libopencv_java3.so)
#define libraries
add_library(native-lib SHARED src/main/cpp/native-lib.cpp)
add_library(grabcut SHARED src/main/cpp/jni-grabcut-lib.cpp src/main/cpp/grabcutter_p.cpp src/main/cpp/grabcutter_p.h)
find_library(log-lib log)
#target libraries
target_link_libraries(native-lib $log-lib lib_opencv)
target_link_libraries(grabcut $log-lib lib_opencv)
【问题讨论】:
您的pathToProject
变量在路径中有分号。这是故意的吗?
将IMPORTED_LOCATION
的值括在双引号中。对pathToProject
变量的值执行相同的操作。否则,由于分号,CMake 将它们视为 list。
@Tsyvarev 非常感谢您的评论
【参考方案1】:
如前所述,CMake 使用分号 ;
来定义列表。因此,如果路径包含分号,则必须将定义和使用变量pathToProject
的位置用双引号括起来:
set(pathToProject "C:\\Users\\Mouad;AITALI\\AndroidStudioProjects\\BGREMOVER")
...
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION "$pathToProject/app/src/main/jniLibs/$ANDROID_ABI/libopencv_java3.so")
IMPORTED_LOCATION
属性只接受一个值。因此,当您提供该属性的列表时,set_target_properties()
命令无法正确解析参数,从而产生错误。
【讨论】:
谢谢你的回答,我知道这应该是另一个问题,但我现在明白了:ninja: error: 'C:/Users/Mouad;AITALI/AndroidStudioProjects/BGREMOVER/app/src/main/jniLibs/arm64-v8a/libopencv_java3.so', needed by '../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libgrabcut.so', missing and no known rule to make it
库libopencv_java3.so
实际上是否存在于那个位置?
在Mouad
和AITALI
之间的屏幕截图中,有一个空格,而不是您在pathToProject
变量中使用的分号。 以上是关于使用错误数量的参数调用 CMake 设置目标属性的主要内容,如果未能解决你的问题,请参考以下文章