Makefile在库中具有未实现的函数

时间:2013-06-16 02:59:22

标签: c makefile

首先,我一直在这里寻找答案,而我却找不到答案。如果真的复制了这个问题,请将我重定向到正确的答案,我会立即将其删除。我的问题是我正在制作一个在.h文件中有一些未实现的函数的C库,这需要在调用这个库的main.c中实现。但是,库中调用它们的实现函数。我有一个这个库的makefile,它给了我"未定义的引用"每个未实现的功能,所以当我尝试链接 的main.c文件中的.os时,我无法实现这些实现,因为原始库不是& #39;由于这些错误而能够编译。

我的问题是,是否有任何可以放入makefile的标志,以便在链接库时忽略未实现的标题或查找它们?

1 个答案:

答案 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上工作,反之亦然。因此,您需要澄清您的问题,以指定解决方案的工作位置。