簡體   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