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