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


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

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

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

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

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

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

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

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

    gcc -DBUILD_INFO="x86 lib v1" hello.c -o hello 

    在hello.c中使用:

    1. #define STROF(x) #x
    2. #define STR(x) STROF(x)
    3. #ifdef BUILD_INFO
    4. #define INFO STR(BUILD_INFO)
    5. #endif
    6. printf("info:%s\n", INFO);

     优点是BUILD_INFO可以传入任何信息,不受任何限制

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

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

    1. string(TIMESTAMP COMPILE_INFO ${CMAKE_SYSTEM_PLATFORM}_%y%m%d_%H_%M)
    2. set(build_info ${COMPILE_INFO})
    3. configure_file(
    4. "${CURR_PATH}/src/gee_version.c.in"
    5. "${CURR_PATH}/src/gee_version.c"
    6. )

    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可以将指定的内容以指定的语言来编译

    首先看使用形式:

    1. const char build_msg[];
    2. int main()
    3. {
    4. printf("%s\n", build_msg);
    5. return 0;
    6. }

    build_msg在编译时生成

    1. TIMESTAMP ?= __TIME__", "__DATE__
    2. str:
    3. @echo 'const char build_msg[] = "Built : "$(TIMESTAMP);' | \
    4. $(CC) $(CFLAGS) -xc -c - -o build_msg.o
    5. hello: str hello.o
    6. $(CC) -o $@ hello.o build_msg.o

    str目标的功能即为将echo的输出作为c语言(-xc)来编译,生成目标文件build_msg.o

    然后在主目标hello中使用,联合主目标程序一起生成exe

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

  • 相关阅读:
    Django Form组件
    继承(个人学习笔记黑马学习)
    【Docker从入门到入土 3】Docker镜像的创建方法
    R语言修改dataframe数据列的名称:使用dplyr包的rename函数修改列名、使用colnmaes函数修改列名、在数据筛选的时候重命名列名
    Springboot项目 配置热部署
    SICP:惰性求值、流和尾递归(Python实现)
    Linux系统使用AndroidStudio创建桌面快捷键
    【2023最新版】DataGrip使用MySQL教程
    【Python百日进阶-数据分析】Day119 - Plotly Figure参数: 散点图(一)
    压力测试工具Jmeter的下载与使用
  • 原文地址:https://blog.csdn.net/wind0419/article/details/126246160