我第一次使用cmake-gui制作opencv_contrib的源代码。我在下面收到错误。我已多次搜索它,但没有得到任何有用的帮助。即使我不知道错误的含义。我不确定是否只是将错误的某些行复制到Google进行搜索是正确的。我真诚地希望得到你的帮助。
CMake Error at cmake/OpenCVDetectPython.cmake:78 (if):
if given arguments:
"NOT" "optimized" "C:/Program Files/Python35/libs/python35.lib" "debug" "C:/Program Files/Python35/libs/python35_d.lib" "EQUAL" ""
Unknown arguments specified
Call Stack (most recent call first):
cmake/OpenCVDetectPython.cmake:219 (find_python)
CMakeLists.txt:562 (include)
if(_found)
set(_version_major_minor "${_version_major}.${_version_minor}")
if(NOT ANDROID AND NOT APPLE_FRAMEWORK)
ocv_check_environment_variables(${library_env} ${include_dir_env})
if(NOT ${${library_env}} EQUAL "")
set(PYTHON_LIBRARY "${${library_env}}")
endif()
让我发疯......
答案 0 :(得分:3)
cmake/OpenCVDetectPython.cmake
中的代码似乎不正确。 (它也没有在回购中纠正。)
正确方式:
if(NOT "${VAR}" STREQUAL "")
在您的情况下cmake/OpenCVDetectPython.cmake
中的原始行:
if(NOT ${${library_env}} EQUAL "")
set(PYTHON_LIBRARY "${${library_env}}")
应重写:
if(NOT "${${library_env}}" STREQUAL "")
set(PYTHON_LIBRARY ${${library_env}})
解释如下。
错误消息所指的行
if(NOT ${${library_env}} EQUAL "")
是函数定义find_python()
的一部分,library_env
是此函数的参数。
该函数被调用两次:一个用于 Python2 ,另一个用于 Python3 。根据错误消息,第二次调用失败,并将PYTHON3_LIBRARY
作为library_env
参数传递。
错误的行可以理解为:
if(NOT ${PYTHON3_LIBRARY} EQUAL "")
它试图检查变量是否为空......但是错误:
如果变量实际上是为空,则CMake完全省略其取消引用,因此该行将被读为
if(NOT EQUAL "")
错误调用if()
命令。
在您的情况下,变量PYTHON3_LIBRARY
的内容是列表:
optimized "C:/Program Files/Python35/libs/python35.lib" debug "C:/Program Files/Python35/libs/python35_d.lib"
它是库的有效值,只要它使用target_link_libraries命令链接。
但是,如果是列表,if()
行变得不正确。这就是您收到错误消息的原因。
最后, EQUAL 比较整数,但字符串与 STREQUAL 进行比较。
可以通过在变量的解除引用周围添加qoutes来解决1和2问题。
至于作业
set(PYTHON_LIBRARY "${${library_env}}")
它错误地处理 list 变量,这正是你的情况。列表变量应引用,不带引号:
set(A_list ${B_list})