如何在编译期间编辑可执行文件而不更改其源? [复制]
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.c
或year_manip.c
,那么当 2015 年到来时,它仍然不会重建,这可能不是你想要的。如有必要,您可以使用make
做一些更复杂的事情来克服这个问题。
对于这个特定问题,当问题纯粹是在#define
之前使用带有值的标识符时,linked question 的答案显然提供了一种更简单的方法,可以在这里使用。对于更通用的代码生成,以这种方式使用 makefile 会很有用。
【讨论】:
以上是关于如何在编译期间编辑可执行文件而不更改其源? [复制]的主要内容,如果未能解决你的问题,请参考以下文章