[英]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.