如何在编译期间编辑可执行文件而不更改其源? [复制]

Posted

技术标签:

【中文标题】如何在编译期间编辑可执行文件而不更改其源? [复制]【英文标题】:How can I edit an executable during compiling, without changing its source? [duplicate] 【发布时间】:2014-11-01 01:02:34 【问题描述】:

我必须编写一个编译文件 year.c 的 Makefile,然后它将显示当前年份(2014),而不是前一年(2013)。我尝试过使用 sed 函数,但它仅在以下情况下才有效我使用 make run 。

#include <stdio.h>

#ifndef YEAR
 #define YEAR "2013"
#endif

int main()
  printf("Hello world from " YEAR "\n");
  return 0;

还有 Makefile:

year: year.c
        gcc year.c -o year

run:
        ./year | sed -e 's/3/4/g'
clean:
        rm year Makefile

【问题讨论】:

假设你的系统时钟是正确的,你可以使用类似 theTimeInSeconds = time(NULL); tm = localtime(theTimeInSeconds);然后使用 year = strfrtime() 之类的东西。 strfrtime 具有原型: size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 格式字符串将是: "%Y" 这将在每次程序运行时为您提供当前年份。 ***.com/q/26670985/971127 这是我们第二次收到这个问题。这是课堂作业。关于课堂作业的 Stack Overflow 政策是什么? @MarkGaleck:堆栈溢出政策是根据每个问题的优点来考虑每个问题。作业与否不应该成为问题,只要问题切题、清晰且表述清楚。 @Mark:这里是the current consensus discussed on Meta。如果您认为值得基于新的观察、发展、见解或想法重新展开讨论,请发布对现有 Meta 讨论之一的答案(已经有几个)或随意发布一个新的。 【参考方案1】:

只需在命令行上定义YEAR - #ifndef 将确保它不会被重新定义:

gcc -DYEAR=\"2014\" -o year year.c 

【讨论】:

【参考方案2】:

在这种特殊情况下,直接在程序中计算年份是更好的解决方案,如 cmets 所述。

不过,一般来说,您需要使 run 成为 year 的依赖项。这是一个使用中间文件的解决方案,它不会覆盖year.c,但如果您愿意,可以修改它以覆盖:

year.c:

#include <stdio.h>

#ifndef YEAR
 #define YEAR "2013"
#endif

int main(void)

  printf("Hello world from " YEAR "\n");
  return 0;

Makefile:

year: run
    gcc year_manip.c -o year

run:
    cat year.c | sed -e 's/3/4/g' > year_manip.c

示例会话:

paul@horus:~/src/sandbox/year$ ls
Makefile year.c
paul@horus:~/src/sandbox/year$ make
cat year.c | sed -e 's/3/4/g' > year_manip.c
gcc year_manip.c -o year
paul@horus:~/src/sandbox/year$ ./year
Hello world from 2014
paul@horus:~/src/sandbox/year$ 

请注意,此解决方案意味着您的程序将始终编译,即您的 run 目标永远不会是最新的。如果你让它依赖于year.cyear_manip.c,那么当 2015 年到来时,它仍然不会重建,这可能不是你想要的。如有必要,您可以使用make 做一些更复杂的事情来克服这个问题。

对于这个特定问题,当问题纯粹是在#define 之前使用带有值的标识符时,linked question 的答案显然提供了一种更简单的方法,可以在这里使用。对于更通用的代码生成,以这种方式使用 makefile 会很有用。

【讨论】:

以上是关于如何在编译期间编辑可执行文件而不更改其源? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

打开vim后怎样编写c/c++/java文件即编译运行 编写完后如何保存 保存路径在哪 路径是不是可更改

如何指示VC ++编译器不内联常量?

库在可执行文件内调用函数,而不是在库内

在编译期间监视文件复制

在“停止”事件期间如何定位克隆的可拖动元素?

如何在文件上传期间保持页面可编辑(Laravel)?