在另一个程序中加载一个 c 程序

Loading a c program in another one

我写了一个程序,我想link它到另一个c程序。从某种意义上说,通过使用 include 或任何其他指令,我需要 link 程序,以便后者可以调用前者的函数。我怎样才能在代码块中完成这个?

假设您现在有两个程序 A 和 B。在 A 中您有函数 c。因此,将 c 移动到单独的文件 c.c 并生成 c.h 文件,它可以作为 #include "c.h" 包含在 A 和 B 程序中。比独立编译A和B。

这将是最简单的方法。

编辑:

所有相互使用的函数都应该在"library"中。例如:

// c.h
int c(int x1, int x2); // this will be called from outside

extern int callCount; // to be available outside

// c.c
#include "c.h"

int d(int x); // this cannot be called from outside

// global variable to count calls of c function
int callCount = 0; 

int c(int x1, int x2)
{
    callCount++; // changing of global variable
    return (x1 + x2) * d(x1);
}

int d(int x)
{
    return x * x;
}

和用法

// prog A
#include <stdio.h>
#include "c.h"

int main(void) 
{
    int a = 1, b = 2;
    printf("c = %d\n", c(a, b));
    printf("c = %d\n", c(2*a, b - 1));
    printf("Function c was called %d times\n", callCount);
    return 0;
}

您计划从其他文件调用的所有函数都应在 h 文件中声明。这是常用的方法,但也可以在网上找到很多技巧,例如static函数,#define侦探和条件编译等

它(在另一个 C 程序中加载一个 C 程序)不能严格意义上完成,因为在任何给定程序中只有一个 main 函数。然而system(3) & popen(3) functions enable you to start another program -thru a command line- from a first one. On Linux and POSIX systems you also can start a process using fork(2) and you can execute a program in a process using execve(2)。当然这是特定于操作系统的!

但是,在某些操作系统和平台上,您可以使用 dynamic linking to load some plugin at runtime. The loaded plugin is not a program (it does not have any main function), but a library

例如,在Linux和POSIX systems, you could use the dlopen function to load a plugin (often some shared library), and the dlsym函数中获取其中的一个符号。

在 Linux,dlopen 正在加载 ELF shared object which should contain position-independent code

PS。您还可以 link 一个库(在构建时)到您的程序。