我有两个编译器选项可以在我的代码中启用/禁用特定方法,当我构建我的代码时,我将这两个版本构建为.LIB
个文件。但是当我查看这两个版本时,它们的输出看起来是一样的。我没有使用十六进制编辑器来比较二进制数据BTW。
代码如下所示:
#define TEST_BUILD
//#define REL_BUILD
#ifdef TEST_BUILD
#define ENABLE_METHOD1
#define ENABLE_METHOD2
#endif
#ifdef REL_BUILD
#define ENABLE_METHOD3
#define ENABLE_METHOD4
#endif
问题是,如何指示哪个文件指示哪个版本的构建?有没有什么常见的方法可以做到这一点?
我想过这样的方式:
#ifdef TEST_BUILD
char *caCodeVersion = "V01.01.16T";
#endif
#ifdef REL_BUILD
char *caCodeVersion = "V01.01.16R";
#endif
当我查看二进制输出时,我会在代码中看到这个字符串并知道它包含哪个版本和构建。有没有其他方法可以做这样的事情?
顺便说一句,输出文件必须是同名的。
答案 0 :(得分:0)
我可以建议这种方法:
#ifdef TEST_BUILD
func_vers_V01.01.16T(void )
{
//Dummy package
}
#endif
#ifdef REL_BUILD
func_vers_V01.01.16R(void )
{
//Dummy package
}
#endif
现在您可以使用nm命令或其他相关命令来读取二进制文件中的符号。
如果存在func_vers_V01.01.16T符号,则它是Test Build else Rel build。
希望这会有所帮助。
答案 1 :(得分:0)
char *caCodeVersion = "V01.01.16R";
这是一种常见的方式。另一种可能性是使用许多编译器中存在的#ident
编译指示:
#ident "v01.01.16R"
然而,这个实用主义并非标准。确保您的编译器支持它!
要使原始char*
方法更可靠地工作,请将常量放入定义其他(使用过的)内容的源文件中,这样就不会丢弃目标文件。
答案 2 :(得分:0)
现在我的一次试验取得了成功,所以这是答案之一。
定义将是:
#ifdef TEST_BUILD
char *caCodeVersion = "V01.01.16T";
#endif
#ifdef REL_BUILD
char *caCodeVersion = "V01.01.16R";
#endif
关键部分,您需要在代码中使用此变量,以避免编译器优化。
我已经在我的一个函数中使用了它,它将memset归零为char数组。
strcpy(caBuffer, caCodeVersion);
memset(caBuffer, 0x00, sizeof(caBuffer));
因此编译器将caCodeVersion
变量保留在输出二进制文件中。
如果我用文本编辑器打开输出二进制文件并找到" V01.01.16T",它就是代码的测试版本。否则它是发布版本。