【问题标题】:Combining (linking) 2 c programs组合(链接)2个c程序
【发布时间】:2020-09-04 03:50:12
【问题描述】:

我有 program_1.c

void foo(void);
int main(void)
{
   foo();
}

program1_foo.c

void foo(void)
{
    do_program1_things();
}

这通常被编译成它自己的程序。

现在我有第二个程序 程序_2.c

void foo(void)
int main(void)
{
   foo();
   program1_main();
}

program2_foo.c

void foo(void)
{
    do_program2_things();
}

这显然是一个最小化的问题,但我想将 2 个单独的程序编译成一个程序,并调用第一个程序的主程序,而不会让程序 1 的函数和定义泄漏到程序 2 中。什么是最好的实现这一点的方法?

编辑:裸机嵌入式c,因此可以通过设置堆栈指针在程序之间跳转,但如果可能的话,我想避免这种情况。

构建一个静态库但只公开 prog1_main() 将是一个理想的解决方案,但似乎这对于 c 是不可能的。

【问题讨论】:

  • 您不能直接在另一个程序中调用代码(取决于操作系统,这可能是可能的,但这并不简单或微不足道)。您可能想了解system 函数,以从其他程序内部执行程序。
  • 我希望将 program_1 编译成静态库(将 main() 更改为 prog1_main())。但是,似乎 c 不允许您在静态库中隐藏/作用域函数。我目前的想法是通过直接设置堆栈指针将2个程序链接到不同的内存地址并在它们之间跳转。我真的很想避免这种情况,因此要求更高级别的解决方案。 (应该澄清裸金属嵌入c顺便说一句)
  • edit 改进您的问题(例如添加重要信息,以及您对可能解决方案的想法)。

标签: c linker


【解决方案1】:

您理解问题所在:需要在不同翻译单元之间链接的函数名称等符号必须是公开的。不能有两个不同的符号同名。所以你需要以某种方式区分它们。


免责声明:这只是一种可能性,而且是一种非常原始的可能性。

您可以像这样为 program1 的模块编写包装器:

// program1_main.c
#define foo program1_foo
#define main program1_main
#include "program_1.c"
// program1_foo.c
#define foo program1_foo
#include "program1_foo.c"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多