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

标签 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()

为简单起见,我们只举一个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/

相关文章:

c - 为什么在错误名称前添加连字符

c - memcpy 函数有任何多线程问题吗?

c - 为什么这个程序截断输出?

c - 释放分配的字符串时内存损坏

c++ - 我们可以在 C++ 中使用 "FILE"吗?

c - Windows 10 : Clang, "stdio.h"找不到

c - 我的 C 宏做错了什么?

c - 使用 GCC 链接对象的两种方法?

c - Swig Lua 成员(member)生成

c++ - 将 5x5 矩阵减少到 c 中的 25 元素数组