1

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

主.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 次。

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

4

5 回答 5

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:-)

于 2011-05-09T20:03:03.223 回答
2

您的第一个代码将无法编译,因为没有test();.

据我了解,您希望获取已编译的main并将其与addthis.o上生成的代码一起添加,以创建名为mainWithAddthis. 这是不可能的!

你要么感到困惑,要么试图做一些铁杆把戏。

于 2011-05-09T20:01:21.587 回答
0

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

  1. 对于您指定的每个源文件(在您的项目/makefile 中),您的编译器将构建一个目标文件
  2. 对于您指定的每个目标文件(在您的项目/makefile 中),您的链接器会将它们链接在一起并使您的可执行文件

重新编译的一种方法是简单地重新构建整个项目。你会得到或多或少相同的结果。

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

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

如果您只有文件addthis.cmain.exe,那么没有可移植的方式来做您想做的事。

于 2011-05-09T20:05:08.240 回答
0

如果没有使用十六进制编辑器的一些核心时间,您就无法在事后做您正在谈论的事情。

但是,如果您提前计划并将其构建到您的软件中,您可以使用动态加载来达到相同的效果,这就是很多软件提供插件功能的方式。查看glib 模块,了解在 C 中执行此操作的常用方法。

于 2011-05-09T20:16:22.443 回答
0

主程序

void f();
int main()
{
  f();
  return 0;
}

插件1.c

#include <stdio.h>
void f()
{
  printf("I am the ONE.\n");
}

插件2.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.

于 2011-05-09T20:24:38.610 回答