【发布时间】: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 解决方案,因为将一个和将相同的目标文件转换成两个完全不同的可执行文件。