繁体   English   中英

C库包括

[英]C library include

我写的是C库,但我不知道如何使某些函数对用户不可见(用于实现功能)。 C有什么办法吗? 我的第二个问题是:当我在.h或.c文件中包含某个库时(让我们看一下math.h),当用户在程序中声明相同的标头(当然使用我的库)时,会有任何问题吗?

那结构呢? 有关键字吗?

通常的方法是使实现函数静态化,即使用存储说明符将其声明为static然后将其放入带有代码的模块中。 因此,两个标头都不会引用这些函数。

如何使某些功能不可见?

  1. 不要在库的头文件中声明函数
  2. 在库的源文件中将函数定义为static

例:

你的lib.h

#ifndef YOUR_LIB_H
#define YOUR_LIB_H

void do_public_stuff(void);

#endif YOUR_LIB_H

您的lib.c

#include "your-lib.h"

// this functions is invisible
static void do_private_stuff(void)
{
    // ...
}

// this functions is visible
void do_public_stuff(void)
{
    // ...
}

用户代码

#include "your-lib.h"

int main(void)
{
    do_public_stuff();
    return 0;
}

您可以使用关键字static作为其他建议的答案。 但有时,库本身将由几个源文件和目标文件组成,并且可能存在一些功能,这些功能必须在整个库中使用,但在链接之后不得导出。

简单的例子:

您的库有3个对象:lib1.o lib2.o util.o

util.o有几个辅助函数,这些函数由lib1.olib2.o 您不能在此处使用static,因为这些函数对它们将不可见,并且链接将失败。

你可以做什么:

使助手功能变为非静态,并为链接程序提供一个版本脚本 ,该脚本仅导出所需的符号:

gcc -shared lib1.o lib2.o util.o -o mylib.so -Wl,--version-script=map

文件map可能具有以下内容:

{
    global: 
        bar;
        baz;
    local: *;
};

这只会导出符号barbaz (这是此示例库的相关API函数),而从符号表中忽略所有其他符号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM