Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String CMake整数比较不起作用_String_Integer_Cmake_Comparison_Libxslt - Fatal编程技术网

String CMake整数比较不起作用

String CMake整数比较不起作用,string,integer,cmake,comparison,libxslt,String,Integer,Cmake,Comparison,Libxslt,我试图使用来检查系统是否已安装,以及它是否来自1.1.27或更高版本。(早期版本中有一个我不想解决的bug。) 运行xsltproc--version时,会得到如下输出: Using libxml 20900, libxslt 10128 and libexslt 817 xsltproc was compiled against libxml 20900, libxslt 10128 and libexslt 817 libxslt 10128 was compiled against lib

我试图使用来检查系统是否已安装,以及它是否来自1.1.27或更高版本。(早期版本中有一个我不想解决的bug。)

运行
xsltproc--version
时,会得到如下输出:

Using libxml 20900, libxslt 10128 and libexslt 817
xsltproc was compiled against libxml 20900, libxslt 10128 and libexslt 817
libxslt 10128 was compiled against libxml 20900
libexslt 817 was compiled against livxml 20900
我编写了这个CMake代码来解析第一行中的第二个整数,并试图将其与10127进行比较,这应该告诉我是否有足够新的
xsltproc版本:

execute_process(COMMAND xsltproc --version
    OUTPUT_VARIABLE XSLTPROC_VERSION ERROR_QUIET)
if(XSLTPROC_VERSION)
    string(REGEX MATCH "libxslt [0-9]+" LIBXSLT_VERSION
        ${XSLTPROC_VERSION})
    if(LIBXSLT_VERSION LESS 10127)  # Always succeeds!  Why?
        message(STATUS "xsltproc found, but it's too old!")
    else()
        message(STATUS "xstlproc found, and new enough")
        set(WORKING_XSLTPROC 1)
    endif()
endif(XSLTPROC_VERSION)
问题是,无论我在
LIBXSLT\u VERSION
中得到什么值,测试总是成功的。当我在发出上面第一个引用块的系统上运行它时,它成功了,但我随后尝试将测试值增加到10129,以说服自己它将沿着失败路径运行,但它没有!我后来在一个带有
libxslt
1.1.17的系统上运行了它,它也成功地运行了

我尝试过使用
VERSION\u LESS
STRLESS
等来翻转逻辑(即
GREATER 10126
),也尝试过将裸整数转换为字符串,取消引用变量名,使其成为字符串到字符串的直接比较,等等。没有任何帮助


我主要使用的是CMake 2.6和2.8。

它看起来像是正则表达式处理的问题

当你打电话时:

string(REGEX MATCH "libxslt [0-9]+" LIBXSLT_VERSION ${XSLTPROC_VERSION})
LIBXSLT\u VERSION
的值将是
LIBXSLT 10128
,而不是裸版本
10128


您可以通过将正则表达式修改为“libxslt([0-9]+)”
并在变量
CMAKE_match_1
中引用捕获的匹配来捕获版本号(
CMAKE_match_0
包含完整匹配;相当于
${libxslt_version}
,即
libxslt 10128

因此,您应该能够执行以下操作:

if(XSLTPROC_VERSION)
    string(REGEX MATCH "libxslt ([0-9]+)" LIBXSLT_VERSION ${XSLTPROC_VERSION})
    if(NOT CMAKE_MATCH_1)
        message(AUTHOR_WARNING "Error during check for xslt version.")
    elseif(CMAKE_MATCH_1 LESS 10127)
        message(STATUS "xsltproc found, but it's too old!")
    else()
        message(STATUS "xstlproc found, and new enough")
        set(WORKING_XSLTPROC 1)
    endif()
endif()
哇摇头:有时,再多的盯着一点代码也不能让问题变得明显,然后第二双眼睛立即看到问题。谢谢