C库包括
C library include
我编写了 C 库,但我不知道如何使某些函数对用户不可见(用于实现功能)。 C有什么办法吗?我的第二个问题是:当我在 .h 或 .c 文件中包含一些库时(让我们看看 math.h),当用户在他的程序(当然使用我的库)中声明相同的头文件时有什么问题吗?
那么结构呢?有关键词吗?
通常的方法是将实现函数设为静态,即使用存储说明符 static
声明它们,并将它们与代码一起放入模块中。因此 header 都不会引用这些函数。
how to make some functions invisible ?
- 不要在你的库的头文件中声明函数
- 在您的库的源文件中将函数定义为
static
示例:
your-lib.h
#ifndef YOUR_LIB_H
#define YOUR_LIB_H
void do_public_stuff(void);
#endif YOUR_LIB_H
your-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)
{
// ...
}
user-code.c
#include "your-lib.h"
int main(void)
{
do_public_stuff();
return 0;
}
您可以使用关键字 static
作为其他答案的建议。
但有时,库本身会由几个源和object-files组成,并且可能有一些功能,必须在整个库中使用,但不应在链接后导出[=39] =].
简单例子:
您的图书馆有 3 个对象:lib1.o lib2.o util.o
位于 util.o
中的是几个 helper-functions,它们被 lib1.o
和 lib2.o
使用。您不能在此处使用静态,因为函数对它们不可见并且链接会失败。
你能做什么:
制作 helper-functions non-static 并为链接器提供 版本脚本 ,它只导出所需的符号:
gcc -shared lib1.o lib2.o util.o -o mylib.so -Wl,--version-script=map
文件 map
可能包含以下内容:
{
global:
bar;
baz;
local: *;
};
这只会导出符号 bar
和 baz
(与此示例库相关的 API-functions),而忽略符号 [=51= 中的所有其他符号].
我编写了 C 库,但我不知道如何使某些函数对用户不可见(用于实现功能)。 C有什么办法吗?我的第二个问题是:当我在 .h 或 .c 文件中包含一些库时(让我们看看 math.h),当用户在他的程序(当然使用我的库)中声明相同的头文件时有什么问题吗?
那么结构呢?有关键词吗?
通常的方法是将实现函数设为静态,即使用存储说明符 static
声明它们,并将它们与代码一起放入模块中。因此 header 都不会引用这些函数。
how to make some functions invisible ?
- 不要在你的库的头文件中声明函数
- 在您的库的源文件中将函数定义为
static
示例:
your-lib.h
#ifndef YOUR_LIB_H
#define YOUR_LIB_H
void do_public_stuff(void);
#endif YOUR_LIB_H
your-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)
{
// ...
}
user-code.c
#include "your-lib.h"
int main(void)
{
do_public_stuff();
return 0;
}
您可以使用关键字 static
作为其他答案的建议。
但有时,库本身会由几个源和object-files组成,并且可能有一些功能,必须在整个库中使用,但不应在链接后导出[=39] =].
简单例子:
您的图书馆有 3 个对象:lib1.o lib2.o util.o
位于 util.o
中的是几个 helper-functions,它们被 lib1.o
和 lib2.o
使用。您不能在此处使用静态,因为函数对它们不可见并且链接会失败。
你能做什么:
制作 helper-functions non-static 并为链接器提供 版本脚本 ,它只导出所需的符号:
gcc -shared lib1.o lib2.o util.o -o mylib.so -Wl,--version-script=map
文件 map
可能包含以下内容:
{
global:
bar;
baz;
local: *;
};
这只会导出符号 bar
和 baz
(与此示例库相关的 API-functions),而忽略符号 [=51= 中的所有其他符号].