这是一种非常老式的编写库的方式(但我一直在编写这样的代码)。正如您现在所发现的,它不适用于共享库。
如果您可以更改库设计
最好的办法是重新排列代码,以便在某些初始化函数中将“缺少的函数”指定为回调。例如,您当前的标题可能有点像:
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
extern int implemented_function(int);
extern int missing_function(int);
#endif
我假设您的库包含implemented_function()
但库中的一个函数调用missing_function()
了用户的应用程序应提供的调用。
您应该考虑按照以下方式重构您的库:
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
typedef int (*IntegerFunction)(int);
extern int implemented_function(int);
extern IntegerFunction set_callback(IntegerFunction);
#endif
您的库代码将具有:
#include "header.h"
static IntegerFunction callback = 0;
IntegerFunction set_callback(IntegerFunction new_callback)
{
IntegerFunction old_callback = callback;
callback = new_callback;
return old_callback;
}
static int internal_function(int x)
{
if (callback == 0)
...major error...callback not set yet...
return (*callback)(x);
}
(或者您也可以return callback(x);
改用;为了清楚起见,我使用旧学校的符号。)然后您的应用程序将包含:
#include "header.h"
static int missing_function(int x);
int some_function(int y)
{
set_callback(missing_function);
return implemented_function(y);
}
使用类似函数的另一种方法set_callback()
是将missing_function
作为指针传递给最终调用它的任何函数。这是否合理取决于缺失函数的使用范围。
如果你不能改变图书馆的设计
如果这根本不可行,那么您将不得不为构建共享库的代码找到特定于平台的选项,以便丢失的引用不会导致构建错误。平台之间的细节差异很大;在 Linux 上有效的在 AIX 上无效,反之亦然。因此,您需要澄清您的问题,以指定您需要解决方案在哪里工作。