在程序中添加编译时间,编译架构,版本号等信息,非常有助于后续的开发维护,尤其在库程序中,当你需要编写一个动态库供其他人调用或者对外释放的时候,将是不可或缺的信息
最简单的方法是在头文件中手动定义宏,缺点是每次都需要手动更改,而且容易忘记
最灵活的方式是在编译过程中自动添加相关信息, 不仅不会遗漏而且能更好的区分不同平台
下面介绍几种常用和不常用的方式
const char *build_info = "Info: " __DATE__ " " __TIME__;
缺点是不灵活,无法获取更多信息,还有文件如果没有更新,将不会再次被编译,导致时间不更新
gcc -DBUILD_INFO="x86 lib v1" hello.c -o hello
在hello.c中使用:
#define STROF(x) #x
#define STR(x) STROF(x)
#ifdef BUILD_INFO
#define INFO STR(BUILD_INFO)
#endif
printf("info:%s\n", INFO);
优点是BUILD_INFO可以传入任何信息,不受任何限制
缺点是只能使用宏定义,无法当作变量一样来使用
string(TIMESTAMP COMPILE_INFO ${CMAKE_SYSTEM_PLATFORM}_%y%m%d_%H_%M)
set(build_info ${COMPILE_INFO})
configure_file(
"${CURR_PATH}/src/gee_version.c.in"
"${CURR_PATH}/src/gee_version.c"
)
gee_version.c.in为模板文件,如下:
static char gee_base_lib_info[] = "@build_info@";
cmakefile在编译时会将其中的字段@build_info@替换,生成gee_version.c文件,最终使用的也是gee_version.c文件
缺点是源文件gee_version.c是自动生成的,不会被版本库管理,真正需要管理的是gee_version.c.h模板文件,需要特别注意一下
-x可以将指定的内容以指定的语言来编译
首先看使用形式:
const char build_msg[];
int main()
{
printf("%s\n", build_msg);
return 0;
}
build_msg在编译时生成
TIMESTAMP ?= __TIME__", "__DATE__
str:
@echo 'const char build_msg[] = "Built : "$(TIMESTAMP);' | \
$(CC) $(CFLAGS) -xc -c - -o build_msg.o
hello: str hello.o
$(CC) -o $@ hello.o build_msg.o
str目标的功能即为将echo的输出作为c语言(-xc)来编译,生成目标文件build_msg.o
然后在主目标hello中使用,联合主目标程序一起生成exe
此种方式最灵活,既可以传入任何信息,还可以当成变量来使用,功能扩展性更加强大