【问题标题】:c macro that knows the programs output file name知道程序输出文件名的c宏
【发布时间】:2015-01-17 23:00:54
【问题描述】:

有没有办法有条件地包括 一段代码取决于构建输出 带有 GCC 的文件名(特别是 mingw / codeblocks)

例如:

我有 2 个配置文件:

项目 1 编译为 foo.exe 项目2编译成bar.exe

两个项目都包含一个名为 myheaders.h 的文件

在 myheaders.h 里面,有关于 程序,

 #define APP_TITLE                     "my project"
 #define APP_VERSION                    0,0,0,1
 #define APP_VERSION_STR               "0,0,0,1"

我的问题:以下可能吗

          #if __OUTPUT__ =="foo.exe"
          #define APP_TITLE                     "my project"
          #define APP_VERSION                    0,0,0,1
          #define APP_VERSION_STR               "0,0,0,1"
          #endif

          #if __OUTPUT__ =="bar.exe"
          #define APP_TITLE                     "side project"
          #define APP_VERSION                    0,0,2,2
          #define APP_VERSION_STR               "0,0,2,2"
          #endif

我知道我可以使用 #defines 将#defines 传递给编译器 命令行选项,但似乎没有 处理资源文件

我的资源文件如下

          #include "myheaders.h"

          VS_VERSION_INFO                       VERSIONINFO
          FILEVERSION                           APP_VERSION
          PRODUCTVERSION                        APP_VERSION
          FILEFLAGSMASK                         VS_FFI_FILEFLAGSMASK
          FILEFLAGS                             VS_FF_PRERELEASE
          FILEOS                                VOS__WINDOWS32
          FILETYPE                              VFT_APP
          FILESUBTYPE                           VFT2_UNKNOWN

          BEGIN
          BLOCK "StringFileInfo"
          BEGIN
          BLOCK "000004b0"
          BEGIN
          VALUE "ProductName",                  APP_TITLE
          VALUE "ProductVersion",               APP_VERSION_STR
          VALUE "FileDescription",              APP_DESCRIPTION
          VALUE "FileVersion",                  APP_VERSION_STR
          VALUE "CompanyName",                  APP_AUTHOR
          VALUE "LegalCopyright",               APP_COPYRIGHT
          VALUE "Comments",                     APP_COMMENTS
          END
          END
          BLOCK "VarFileInfo"
          BEGIN
          VALUE "Translation",                  0x000,0x4b0
          END
          END

APP_TITLE 在所有源文件中扩展为正确的字符串,除了 资源文件,它只会导致语法错误..

如果我在没有宏条件的情况下定义 APP_TITLE 一切正常..

【问题讨论】:

  • 使用-D命令行开关?
  • #if __OUTPUT__ =="foo.exe" 这样你就不能使用字符串("foo.exe")了。
  • 我认为这可能行不通。预处理器独立于编译器和汇编器运行,它们再次独立于链接器运行,但只有这四个中的最后一个会关心最终可执行文件的名称。但到那时,预处理器做出任何决定为时已晚。
  • @5gon12eder 我知道这是一个 CodeBlocks 问题,但在 Visual Studio 领域,IDE 为目标文件名等内容预定义了宏,您可以在预构建事件中使用它们,例如OP想要(但我认为那会很疯狂)。但是我不知道 CodeBlocks 中是否存在这样的东西
  • @PeterM 显然我忘记了那里有一些非常奇怪的 IDE……好吧,至少不能有一个 portable 解决方案,因为将一个和将相同的目标文件转换成两个完全不同的可执行文件。

标签: c macros


【解决方案1】:

更新:资源使用 rc.exe 编译,而不是 C/C++ 编译器。您需要使用 rc.exe 的 /d 选项来指定 /d MYPROJECT/d SIDEPROJECT

然后在代码中:

      #ifdef MYPROJECT
      #define APP_TITLE                     "my project"
      #define APP_VERSION                    0,0,0,1
      #define APP_VERSION_STR               "0,0,0,1"
      #endif

      #ifdef SIDEPROJECT
      #define APP_TITLE                     "side project"
      #define APP_VERSION                    0,0,2,2
      #define APP_VERSION_STR               "0,0,2,2"
      #endif

【讨论】:

  • 是的 - 它可以编译,但它不起作用 --- 我有一个名为 resource.rc 的文件,其中还包含“myheaders.h”并使用 APP_TITLE 等来填写文件信息,, - 和它失败了
  • 听起来您正在构建一个 Windows 项目,需要将相同的定义传递给资源编译器。您是否使用 rc.exe 来编译 .rc 文件?如果是这样,请使用/d option。更多细节在这里:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 在运行时,argv[0] 是一个指向包含 path/executableName 的字符串的指针,您可以使用 basename() 函数提取 executableName,然后使用 compile/llink 序列输出想要的文件名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2015-07-22
  • 2014-02-04
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
相关资源
最近更新 更多