[英]C library include
我写的是C库,但我不知道如何使某些函数对用户不可见(用于实现功能)。 C有什么办法吗? 我的第二个问题是:当我在.h或.c文件中包含某个库时(让我们看一下math.h),当用户在程序中声明相同的标头(当然使用我的库)时,会有任何问题吗?
那结构呢? 有关键字吗?
通常的方法是使实现函数静态化,即使用存储说明符将其声明为static
然后将其放入带有代码的模块中。 因此,两个标头都不会引用这些函数。
如何使某些功能不可见?
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.o
和lib2.o
。 您不能在此处使用static,因为这些函数对它们将不可见,并且链接将失败。
你可以做什么:
使助手功能变为非静态,并为链接程序提供一个版本脚本 ,该脚本仅导出所需的符号:
gcc -shared lib1.o lib2.o util.o -o mylib.so -Wl,--version-script=map
文件map
可能具有以下内容:
{
global:
bar;
baz;
local: *;
};
这只会导出符号bar
和baz
(这是此示例库的相关API函数),而从符号表中忽略所有其他符号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.