我有一个问题。我想知道你是否可以用另一段代码重新编译代码。例如(理论上):
main.c中:
#include <stdio.h>
void showme();
int main()
{
showme();
}
void showme()
{
fprintf(stderr, "errtest, show me");
}
将此文件编译为main。 (所以主要编译) 在此之后我想添加一段代码。
addthis.c:
void test()
{
test();
}
现在我想使用(编译好的)main并使用addthis.c重新编译它。 运行时(./ mainWithAddthis)应该显示2次打印。
我希望我能解释清楚。有人有想法吗?
答案 0 :(得分:6)
您需要void test()
的前瞻声明,就像void showme()
一样。使用.c
(仅编译)选项编译每个-c
文件:
gcc -c addthis.c -o addthis.o
gcc -c main.c -o main.o
然后将两个目标文件链接到:
gcc main.o addthis.o -o main
然后享受./main
: - )
答案 1 :(得分:2)
您的第一个代码无法编译,因为没有test();
的定义。
据我了解,您希望使用已编译的 main 并将其添加到 addthis.o 上生成的代码,以创建名为mainWithAddthis
的第二个应用程序。这是不可能的!
你要么感到困惑,要么试图做一些硬核技巧。
答案 2 :(得分:0)
构建可执行文件是一个两步过程。
重新编译的一种方法就是重新构建整个项目。你会得到或多或少相同的结果。
但听起来你想要做的只是重新编译源文件addthis.c
,然后重新链接旧版main.o
(为main.c
编译的目标文件)使用新版addthis.o
。如何做到完全取决于您使用的编译器和构建系统。
此外,该解决方案仅在您具有main.o
,addthis.c
且具有完全相同的编译器二进制文件/安装以及用于生成main.o
的编译器标志时才有效。如果这一切都在您的盒子上,那么您可能还可以。
如果您只有文件addthis.c
和main.exe
,那么没有便携式的方法可以做您想要的事情。
答案 3 :(得分:0)
在没有使用十六进制编辑器的核心时间之后,你不能做你正在谈论的事情。
但是,如果您提前计划并将其构建到您的软件中,您可以使用动态加载来实现相同的效果,这就是许多软件提供插件功能的方式。查看glib modules以了解在C中执行此操作的常用方法。
答案 4 :(得分:0)
的main.c
void f();
int main()
{
f();
return 0;
}
addon1.c
#include <stdio.h>
void f()
{
printf("I am the ONE.\n");
}
addon2.c
#include <stdio.h>
void f()
{
printf("I am the TWO.\n");
}
汇编
gcc -c main.c -o main.o
gcc -c addon1.c -o addon1.o
gcc -c addon2.c -o addon2.o
gcc main.o addon1.o -o main1
gcc main.o addon2.o -o main2
您将拥有./main1
和./main2
个程序,这些程序将打印...ONE.
和...TWO.
。