C语言程序编译过程中自动添加编译时间等相关信息

在程序中添加编译时间,编译架构,版本号等信息,非常有助于后续的开发维护,尤其在库程序中,当你需要编写一个动态库供其他人调用或者对外释放的时候,将是不可或缺的信息

最简单的方法是在头文件中手动定义宏,缺点是每次都需要手动更改,而且容易忘记

最灵活的方式是在编译过程中自动添加相关信息, 不仅不会遗漏而且能更好的区分不同平台

下面介绍几种常用和不常用的方式

第一, 通过编译器自带的宏定义,获取相关信息,比如时间

const char *build_info = "Info: " __DATE__ " " __TIME__;

缺点是不灵活,无法获取更多信息,还有文件如果没有更新,将不会再次被编译,导致时间不更新

第二, 编译时通过-D定义符号传入,在程序中使用宏

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可以传入任何信息,不受任何限制

缺点是只能使用宏定义,无法当作变量一样来使用

第三, 通过cmakefile编译,使用configure_file

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模板文件,需要特别注意一下

第四,通过gcc -x选项

-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

此种方式最灵活,既可以传入任何信息,还可以当成变量来使用,功能扩展性更加强大

你可能感兴趣的:(Linux,c语言,c++,自动添加编译时间,编译信息,源代码中使用编译时间)