从C中的静态库外部调用函数

时间:2019-03-05 08:58:26

标签: c

我需要生成一个包含未实现功能的静态库MyLib.lib。

在项目内部,我调用了未实现的函数,如下所示:

/* Inside MyLib.c */

#include "MyLib.h"

void foo(void)
{
   func(); // To be implemented by the user.
}

在头文件MyLib.h中,我包含了头文件

#include "user.h" // contains user_imlplementation_of_func()

...


#define func()         user_imlplementation_of_func()

为简单起见,我们只举一个例子。c:

void user_imlplementation_of_func(void)
{
   printf("OK");
}

我想知道是否可以拨打此电话?否则,是否有其他解决方案可以在静态库中使用未实现的函数,并让用户在将项目从源代码压缩到.lib文件后对其进行定义

2 个答案:

答案 0 :(得分:2)

您需要在库的标题中将未实现的函数声明为extern。这告诉编译器该函数将在其他地方定义。

示例:

MyLib.h

void foo();

extern void func();

MyLib.c

#include "MyLib.h"

void foo(void)
{
    func();
}

main.c

#include <stdio.h>
#include "MyLib.h"

void func()
{
    printf("Hello, world!\n");
}

int main()
{
    foo();
}

示例构建:

cc -o MyLib.o -c MyLib.c
cc -o out main.c MyLib.o

输出:

$ ./out
Hello, world!

但是,为了提高可读性,建议您将项目函数作为指向库函数的指针传递。这通常称为callback

示例:

/* MyLib.c */

#include "MyLib.h"

void foo(void (*func)(void))
{
   func();
}

现在,您可以使用以下命令在项目中调用foo函数:

foo(&user_imlplementation_of_func);

编辑:

如用户theSealion的评论所述,第三个解决方案是使用弱符号。 The wikipedia articel "Weak symbol"通过示例提供了很好的解释。

答案 1 :(得分:0)

您还可以做其他事情-函数指针:

//youLib.c

extern void (*func)(void) = NULL;

extern void foo()
{
    if (func != NULL) {
        func();
    }
}
//main.c

static void user_imlplementation_of_func(void)
{
    printf("Hello\n");
}

func = &user_imlplementation_of_func;
foo(); //Will printf "Hello"