【问题标题】:Use macro more than once in a section在一个部分中多次使用宏
【发布时间】:2012-05-07 04:21:43
【问题描述】:

我在一个部分中多次调用宏。宏检查目录是否存在,如果不存在则创建该目录。

我的问题:我收到一个错误,因为我在一个部分内多次调用此宏。如何修复我的编译错误?

错误:“错误:标签“CreateDirThenInstall:”已在部分中声明”

你能告诉我如何在一个部分中多次使用这个宏吗?

Section "Install Plugin Files" MainSetup
  !insertmacro ValidateDir "c:/blah"
  setOutPath "c:/blah"
  file "C:/blah/a.txt"
  file "C:/blah/b.txt"

  !insertmacro ValidateDir "c:/other"
  setOutPath "c:/other"
  file "c:/other/a.txt"
  file "c:/other/b.txt" 
sectionend

!macro ValidateDir dir
   IfFileExists "$dir" ExitMacro CreateDirThenInstall
   CreateDirThenInstall:   # Error here: Error: label "CreateDirThenInstall:" already declared in section
      createDirectory "${dir}"   
   ExitMacro: 
!macroend

【问题讨论】:

    标签: installation nsis


    【解决方案1】:

    问题出在标签上,而不是宏上。 您在该部分中使用了两次完全相同的标签,这是不可能的。

    您可以使宏中的标签唯一(即使宏插入不止一次)。编译时命令${__LINE__} 可以用于此。然后你可以这样写:

    !macro ValidateDir dir
      !define UniqueId1 ${__LINE__}
      !define UniqueId2 ${__LINE__}
      IfFileExists "${dir}" Exit_${UniqueId1} CreateDir_${UniqueId2}
      CreateDir_${UniqueId2}:
          createDirectory "${dir}"   
      Exit_${UniqueId1}: 
      !undef UniqueId1
      !undef UniqueId2
    !macroend
    

    但在你的情况下,我认为以上没有必要。 SetOutPath 指令会根据需要为您创建目录。来自文档:

    设置输出路径 ($OUTDIR) 并创建它(递归如果 必要),如果它不存在。

    因此,如果您不需要了解创建的每个目录(并将其写入某处,例如在卸载期间使用它),您根本不必这样做。

    【讨论】:

      猜你喜欢
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      相关资源
      最近更新 更多