【问题标题】:How can I extract a string from a C++ header file into an NSIS variable?如何将 C++ 头文件中的字符串提取到 NSIS 变量中?
【发布时间】:2014-11-04 20:46:07
【问题描述】:

我有一个应用程序,其版本号在 C/C++ 头文件中指定,version.h:

#ifndef VERSION_H
#define VERSION_H

#define APPLICATION_VERSION "1.2.3"

#endif

版本号也在 NSIS 脚本中指定,

!ifndef VERSION
!define VERSION "1.2.3"
!endif

以便此字符串可以包含在安装程序的名称中。 NSIS 脚本有什么办法可以直接从version.h 中读取这个值,这样我只需要在一个地方指定版本号?

【问题讨论】:

    标签: nsis


    【解决方案1】:

    在编译时使用!searchparse!searchreplace!define /math读取/操作版本号:

    !searchparse /file "c:\some\path\version.h" `#define APPLICATION_VERSION "` VERSION `"`
    

    下一个示例使用一个临时文件,因此可以在没有外部依赖项的情况下对其进行测试:

    !tempfile testhdr
    !appendfile "${testhdr}" "#ifndef VERSION_H$\n"
    !appendfile "${testhdr}" "#define VERSION_H$\n"
    !appendfile "${testhdr}" '#define APPLICATION_VERSION "1.2.3"$\n'
    !appendfile "${testhdr}" "#endif$\n"
    
    !searchparse /file "${testhdr}" `#define APPLICATION_VERSION "` VER_MAJOR `.` VER_MINOR `.` VER_BUILD `"`
    !searchparse /file "${testhdr}" `#define APPLICATION_VERSION "` VER_STRING `"`
    
    !delfile "${testhdr}" ; Cleanup
    
    !warning "${VER_MAJOR}, ${VER_MINOR}, ${VER_BUILD}"
    !error "${VER_STRING}"
    

    也可以编写一个包含有效 C 和 NSIS 代码定义的标头:

    #define /*
    !define /**/ \
    FOO "Bar"
    

    【讨论】:

    • 这段代码似乎创建了一个临时文件……您能否提供一个从现有文件中读取文本的示例,就像我的问题一样?
    • 只是为了让示例可以在任何没有外部文件的机器上运行,只需将!searchparse /file "${testhdr}"替换为!searchparse /file "c:\foo\bar\version.h"并删除所有与testhdr相关的代码...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多