首先,我一直在这里寻找答案,而我却找不到答案。如果真的复制了这个问题,请将我重定向到正确的答案,我会立即将其删除。我的问题是我正在制作一个在.h文件中有一些未实现的函数的C库,这需要在调用这个库的main.c中实现。但是,是库中调用它们的实现函数。我有一个这个库的makefile,它给了我"未定义的引用"每个未实现的功能,所以当我尝试链接 的main.c文件中的.os时,我无法实现这些实现,因为原始库不是& #39;由于这些错误而能够编译。
我的问题是,是否有任何可以放入makefile的标志,以便在链接库时忽略未实现的标题或查找它们?
答案 0 :(得分:0)
这是一种非常老式的编写库的方式(但我已经编写了类似的代码)。正如您现在发现的那样,它不能很好地与共享库一起使用。
最好的办法是重新排列代码,以便在某些初始化函数中将“缺失函数”指定为回调函数。例如,您当前可能有一个类似的标题:
#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上工作,反之亦然。因此,您需要澄清您的问题,以指定解决方案的工作位置。