0

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

我的问题是,是否有任何标志可以放入生成文件中,以便在链接库后忽略未实现的标头或查找它们?

4

1 回答 1

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

于 2013-06-16T03:12:24.477 回答