为C/C++代码文件添加自定义版本

jvlzgdj9  于 2023-06-21  发布在  C/C++
关注(0)|答案(2)|浏览(250)

我的问题与C源文件有关。让我试着用简单的术语来解释。假设我有2个可执行文件如下-

  • main1.exe-通过链接main1.cf1.cf2.c创建
  • main2.exe-通过链接main2.cf2.cf3.c创建

我需要用一些自定义文本标记这些代码文件,以便可以标识用于构建可执行文件的代码版本。例如,我更改了f2.c并将编译限制为仅创建main1.exe
因此,根据一些自定义文本,我想确定main1.exe包含f2.c的更改版本,而main2.exe没有。基本上,像下面这样的grep命令应该确认main1.exe有自定义文本,而main2.exe没有。

grep <custom text> *.exe

是否有任何指令/宏可以定义来实现这一点?
或者,我可以简单地添加一个注解/* f2.c_version_xxx */grep这个文本。然而,我想检查C是否提供了任何可以用来满足此要求的功能。

cdmah0mi

cdmah0mi1#

您可以使用两个不同的值添加-Dpreprocessor option

$ gcc -c main1.c f1.c f2.c -DBUILD_VERSION=1 -o main1.exe
$ gcc -c main2.c f3.c f2.c -DBUILD_VERSION=2 -o main2.exe

f2.c

#include <stdio.h>

static const int version = BUILD_VERSION;

void print_build_version()
{
    printf("file version used to build this file is %d\n", version);
}

也可以像这样使用const char:
f2.c

#include <stdio.h>

static const char version_cstr[] = BUILD_VERSION;

void print_build_version()
{
    printf("file version used to build this file is %s\n", version_cstr);
}
$ gcc -c main1.c f1.c f2.c -DBUILDSTR="\"Build version 1\"" -o main1.exe

因为version_cstr是一个常量变量,它的内容应该放在只读部分,你可以在执行之前使用objdump来查找version_cstr的值:

$ objdump -sj .rdata f2.o
nafvub8i

nafvub8i2#

如果要重新编译源文件的所有依赖项,则应使用生成系统。这就是它们的作用考虑使用CMake而不是Makefile或IDE。
我用一些自定义文本标记这些代码文件,这样我就可以识别用于构建可执行文件的代码版本
很好。为每个源文件生成一个版本,例如md5 sum,并将其嵌入到可执行文件中。在“c-预处理器”或C中,没有任何可用的东西,你可以用它来标记你的问题。

  • 在使用CMake的Linux * 上,我可以考虑生成一个包含所有md5 sums和编译中使用的所有文件的文件名的文本文件,并将其添加到可执行文件中的新部分。下面沿着一些东西可以让你开始:
get_target_property(srcs my_project SOURCES)
add_custom_command( 
   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/my_projects.md5
   DEPENDS ${srcs}
   COMMAND md5sum ${srcs} > ${CMAKE_CURRENT_BINARY_DIR}/my_projects.md5
)
add_custom_command(
   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/my_project_with_versions
   DEPENDS my_project ${CMAKE_CURRENT_BINARY_DIR}/my_projects.md5
   COMMAND objcopy
      --add-section myversions=${CMAKE_CURRENT_BINARY_DIR}/my_projects.md5
      --set-section-flags .mydata=noload,readonly
      $<TARGET_FILE:my_project>
      ${CMAKE_CURRENT_BINARY_DIR}/my_project_with_versions
)

相关问题