【问题标题】:String regex replace need 6 args but..MinGW , CMake , w7字符串正则表达式替换需要 6 个参数但是..MinGW , CMake , w7
【发布时间】:2014-01-10 12:40:47
【问题描述】:

我正在尝试在 w7 中构建我在 CentOS 6.5 上使用的应用程序,但我需要针对 Windows 32 和 64 位进行编译。 该程序使用 RTi 库,但 Win 库是为 VS2010 制作的,我正在尝试使用 MinGW Gcc 4.x.x、CMake 2.8.12 和 Maven 3.02 构建。我更正了一些数据类型不兼容的问题,但我认为 MinGW 和 Windows 7 之间的斜杠和正斜杠可能存在一些问题。 基础程序编译成功,现在是二进制文件的时候了。 当我执行 cmake -G "MinGW Makefiles" 表达式时,出现此错误。

CMake Error at C:/Workspace/trunk/IB/src/make/IB.Utils.cmake:43 (string):
  string sub-command REGEX, mode REPLACE needs at least 6 arguments total to
  command.
Call Stack (most recent call first):
  C:/Workspace/trunk/IB/src/make/IB.Utils.cmake:116 (RemoveCXXComments)
  C:/Workspace/trunk/IB/src/make/IB.DDS.cmake:12 (HasInterfaces)
  C:/Workspace/trunk/IB/src/make/IB.DDS.cmake:59 (GetDDSGeneratedFiles)
  CMakeLists.txt:6 (GenerateIDLLibrary)


 CMake Error at C:/Workspace/trunk/IB/src/make/IB.Utils.cmake:43 (string):
  string sub-command REGEX, mode REPLACE needs at least 6 arguments total to
  command.
Call Stack (most recent call first):
  C:/Workspace/trunk/IB/src/make/IB.Utils.cmake:65 (RemoveCXXComments)
  C:/Workspace/trunk/IB/src/make/IB.DDS.cmake:74 (FindIncludes)
  CMakeLists.txt:6 (GenerateIDLLibrary)


Includes for 'C:/MinGW/msys/1.0/home/blcoalla/trunk/Example/TestProfiles/TestPayload.idl'        are
CMake Error at C:/Workspace/trunk/IB/src/make/IB.Utils.cmake:43 (string):
  string sub-command REGEX, mode REPLACE needs at least 6 arguments total to
  command.
Call Stack (most recent call first):
  C:/Workspace/trunk/IB/src/make/IB.Utils.cmake:65 (RemoveCXXComments)
  C:/Workspace/trunk/IB/src/make/IB.DDS.cmake:111 (FindIncludes)
  CMakeLists.txt:6 (GenerateIDLLibrary)

这是 utils.cmake 的摘录:

Macro to get the content of a file

-----------------------------------------------------------------

宏(GetFileContent OutFile)

  #message("Called GetFileContent '${ARGN}'")
  SET(cat_prog cat)
  IF(WIN32)
    IF(NOT UNIX)
      SET(cat_prog type)
    ELSE(NOT UNIX)
      message (FATAL_ERROR "cannot determine the system to call to proper 'cat/type'     method")
    ENDIF(NOT UNIX)
  ENDIF(WIN32)

  set (Out)
  set (tmp)

  foreach(gfcfile ${ARGN})

    if (NOT EXISTS ${gfcfile})
      message(FATAL_ERROR "Cannot find file '${gfcfile}'")
    endif(NOT EXISTS ${gfcfile})

    EXECUTE_PROCESS(COMMAND ${cat_prog} ${gfcfile}
                    OUTPUT_VARIABLE tmp)
    set (Out ${Out} ${tmp})

  endforeach(gfcfile ${ARGN})

  set(${OutFile} ${Out})
  #message("Leaving GetFileContent")

endmacro(GetFileContent)
#-----------------------------------------------------------------

# Macro to get includes from an IDL file
#-----------------------------------------------------------------
macro (RemoveCXXComments Output Input)

  #message("RemoveCXXComments Input: '${Input}'")
  # Remove single line comments
  string(REGEX REPLACE "(//[^\n]*\n)" "" ${Output} ${Input})
  #message("RemoveCXXComments without single line: '${${Output}}'")

  # Remove several line comments in file
  string(REGEX REPLACE "(/\\*([^*]|[\r\n]|(\\*+([^*/]|[\r\n])))*\\*+/)" "" FileContent         ${FileContent})
  #message("RemoveCXXComments without multi line: '${${Output}}'")

endmacro (RemoveCXXComments)
#-----------------------------------------------------------------






from CMakeLists.txt6:
GenerateIDLLibrary(TestPayload TestPayload.idl)

from IB.DDS.cmake:59:
# Get expected generated files
GetDDSGeneratedFiles(DDSCXXGeneratedFiles DDSHGeneratedFiles ${IdlFile})
# message("CXX Files expected to be generated:     '${DDSCXXGeneratedFiles}'")
#message("H Files expected to be generated:    '${DDSHGeneratedFiles}'")

【问题讨论】:

    标签: c++ cmake mingw


    【解决方案1】:

    错误消息提示您的变量之一为空。您可以输出变量并检查哪个为空且不应为空。我猜想 Windows 会失败,并且没有设置变量。如果变量为空或未设置,CMake 根本看不到您提供了参数。

    如果你想强制你的正则表达式,你可以在参数周围加上引号。然后 CMake 知道您给出了正确数量的参数,并且它不会抱怨 "" 作为参数。但这并不能解决您的真正问题,而只能平息您当前的问题。我不建议你这样做,除非你真的知道没关系。

    【讨论】:

    • 我尝试引用 ARGS,但在接下来的步骤中编译得到空路径并给我一个 Java.FileNotFoundException。
    • 问题是在windows REGEX REPLACE ARGS 需要被引用。
    • 我必须通过引用 REGEX REPLACE 的最后一个参数,在 linux 上使用 cmake 3.0.2 对 /usr/share/cmake-3.0/Modules/CPackDeb.cmake 进行修复。
    【解决方案2】:

    OutputInputFileContent 均未定义。错误必须在其他地方,您可以使用

    if( DEFINED ${Output} )
        message( "Output defined")
    

    检查它们的一致性。


    -> 作为提示,如果您编写了此代码,您可以替换为

    ${variable}
    

    "${variable}
    

    为了避免使用未定义的变量(如果“”字符串更可取,您仍然需要说明为什么您要使用未定义的变量)

    【讨论】:

    • 我尝试引用 ARGS,但在接下来的步骤中编译得到空路径并给我一个 Java.FileNotFoundException。
    • 所以您要从 java 源代码中删除 cmets... 这些源代码是做什么用的?也许您没有以某种方式复制它们。这个问题太广泛了,如果没有任何关于如何编写代码的信息就无法解决
    • 我有这个问题,这段代码不是我写的,我认为这个程序是 copyinh 并删除 IDL 包含的路径和 cmets。我的功能是编译@Win,出现问题时我更正了。对不起,如果我不能给你更多的信息。
    • GenerateIDLLibrary.. 似乎它正在为库生成 IDL 文件。你能走到 CMakeLists.txt:6 或 IB.DDS.cmake:59 看看这些文件是从哪里来的吗?
    • 行写在主帖中,这里不能索引。
    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多