我可以用新代码重新编译文件吗?

时间:2011-05-09 19:59:02

标签: c compilation recompile

我有一个问题。我想知道你是否可以用另一段代码重新编译代码。例如(理论上):

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次打印。

我希望我能解释清楚。有人有想法吗?

5 个答案:

答案 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)

构建可执行文件是一个两步过程。

  1. 对于您指定的每个源文件(在您的project / makefile中),您的编译器将构建一个目标文件
  2. 对于您指定的每个目标文件(在您的project / makefile中),您的链接器会将它们链接在一起并生成可执行文件
  3. 重新编译的一种方法就是重新构建整个项目。你会得到或多或少相同的结果。

    但听起来你想要做的只是重新编译源文件addthis.c,然后重新链接旧版main.o(为main.c编译的目标文件)使用新版addthis.o。如何做到完全取决于您使用的编译器和构建系统。

    此外,该解决方案仅在您具有main.oaddthis.c且具有完全相同的编译器二进制文件/安装以及用于生成main.o的编译器标志时才有效。如果这一切都在您的盒子上,那么您可能还可以。

    如果您只有文件addthis.cmain.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.