在Windows上构建opencv_contrib:" cmake / OpenCVDetectPython.cmake上的CMake错误:78"

时间:2017-01-23 14:11:25

标签: cmake opencv3.0

我第一次使用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)

cmake / OpenCVDetectPython.cmake:73-80

 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()

注意:

  • 我从我自己的文件中获取源代码(cmake / OpenCVDetectPython.cmake:73-80)。当我尝试单击生成按钮时出现错误。
  • 我的环境是:
    • CPU:Intel Pentium 2020E(64X)
    • 操作系统:Windows10(64X)
    • opencv_version:3.1.0
    • cmake_version:3.7.2(win-64X)
    • python_version:3.5
    • VisualStudio_version:2015

让我发疯......

1 个答案:

答案 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 "")

它试图检查变量是否为空......但是错误

  1. 如果变量实际上是为空,则CMake完全省略其取消引用,因此该行将被读为

    if(NOT EQUAL "")
    

    错误调用if()命令。

  2. 在您的情况下,变量PYTHON3_LIBRARY的内容是列表

    optimized "C:/Program Files/Python35/libs/python35.lib" debug "C:/Program Files/Python35/libs/python35_d.lib"
    

    它是的有效值,只要它使用target_link_libraries命令链接。

    但是,如果是列表,if()行变得不正确。这就是您收到错误消息的原因。

  3. 最后, EQUAL 比较整数,但字符串与 STREQUAL 进行比较。

  4. 可以通过在变量的解除引用周围添加qoutes来解决1和2问题。

    至于作业

    set(PYTHON_LIBRARY "${${library_env}}")
    

    它错误地处理 list 变量,这正是你的情况。列表变量应引用,不带引号

    set(A_list ${B_list})