在程序中添加编译时间,编译架构,版本号等信息,非常有助于后续的开发维护,尤其在库程序中,当你需要编写一个动态库供其他人调用或者对外释放的时候,将是不可或缺的信息
最简单的方法是在头文件中手动定义宏,缺点是每次都需要手动更改,而且容易忘记
最灵活的方式是在编译过程中自动添加相关信息, 不仅不会遗漏而且能更好的区分不同平台
下面介绍几种常用和不常用的方式
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
此种方式最灵活,既可以传入任何信息,还可以当成变量来使用,功能扩展性更加强大