我已经编写了一个程序,我想将它链接到另一个c程序。从某种意义上说,通过使用include或任何其他指令,我需要链接程序,以便后者可以调用前者的函数。我怎样才能在代码插件中实现这一目标?
答案 0 :(得分:3)
假设您现在有两个程序A和B.而在A中你有函数c
。因此,将c
移至单独的文件c.c
并制作c.h
文件,该文件可以作为#include "c.h"
包含在A和B程序中。比独立编译A和B.
这将是最简单的方式。
修改强>
所有互相使用的功能都应该在“库”中。 E.g:
// 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
侦探和条件编译等。
答案 1 :(得分:1)
它(在另一个程序中加载一个C程序)不能严格完成,因为在任何给定的程序中只有一个main
函数。然而system(3)&amp; popen(3)函数使您能够从第一个程序启动另一个程序 - 通过命令行。在Linux和POSIX系统上,您还可以使用fork(2)启动流程,并且可以使用process在execve(2)中执行程序。当然这是特定于操作系统的!
但是,在某些操作系统和平台上,您可以使用dynamic linking在运行时加载一些plugin。加载的插件不一个程序(它没有任何main
函数),但是library。
例如,在Linux和POSIX系统上,您可以使用dlopen函数加载插件(通常是shared library})和dlsym函数来获取里面有一个符号。
在Linux上,dlopen
正在加载ELF共享对象,该对象应包含position-independent code。
PS。您还可以将库(在构建时)链接到您的程序。