gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:05 26 4
gpt4 key购买 nike

我需要生成一个包含未实现函数的静态库 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()

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

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

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

最佳答案

您需要在库的 header 中将未实现的函数声明为 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"通过示例提供了很好的解释。

关于从 C 中的静态库外部调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54998904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com