我在我的「C」代碼中有一些功能。當我編譯.so時,我在結果.so文件中看到所有名稱。我如何指定(在代碼或make文件中)只有一些函數應該被導出,而其他函數是專用於內部使用的。如何在編譯C代碼時指定從.so庫導出哪些函數?
回答
在C語言中,如果你想讓一個函數保持在文件內部(技術上說是「編譯單元」),那麼你就聲明它是「靜態的」。例如,
static int privateAddOne(int x) { return x + 1; }
私有的編譯單元和私有的庫幾乎是不一樣的 - 大多數不平凡的庫有許多源文件。 – 2010-12-17 07:44:33
既然你提到.so
文件,好像你正在使用gcc
或GCC-一樣編譯一個合理的假設。
默認情況下,所有extern
函數在鏈接對象中都可見。您可以隱藏使用hidden
屬性上的案件逐案基礎功能(和全局變量)(同時保持它們extern
,這使得他們能夠從其他源文件在同一個庫中使用):
int __attribute__((visibility("hidden"))) foo(void)
{
return 10;
}
或者,您可以在編譯時將-fvisibility=hidden
選項傳遞給gcc
,將缺省值更改爲hidden
。然後,您可以使用以下標記特定函數進行導出:
__attribute__((visibility("default")))
+1老實說,這是比接受的更好的答案(因爲它更強大)。當然,你應該使用這兩種混合! – alternative 2010-12-17 00:48:39
+1要添加另一個選項,您可以使用ld鏈接器和版本腳本的組合來實現類似的結果,而無需觸摸源代碼。 – vanza 2010-12-17 00:57:32
這個答案是正確的,但你永遠不要使用它。依靠隱藏符號來隱藏符號以避免污染名稱空間並破壞調用程序的代碼本質上是不可移植的。如果您需要不應該在庫本身之外使用的外部函數,則應該簡單地將它們的名稱加上一些庫特定的垃圾(但不包括前導下劃線)。 – 2010-12-17 03:45:24
- 1. C++編譯器如何決定調用哪些函數?
- 2. 如何編寫C .so庫來替代現有的C++ .so庫?
- 3. 確定哪些函數在代碼中
- 4. 何時函數編譯代碼
- 5. 當源代碼中存在未定義的函數時,C++如何編譯?
- 6. 編譯此C++代碼時出錯
- 7. 編譯C++代碼時出錯?
- 8. 編譯C代碼時出錯
- 9. 從.SO(linux)導出C++類
- 10. 如何即時編譯C#7代碼?
- 11. 如何在編譯時從外部文件導入Perl代碼?
- 12. 編譯一些簡單的C++代碼時出錯
- 13. 我如何編譯C#代碼的IL代碼指令
- 14. 如何在C代碼中使用RcppEigen編譯函數
- 15. c#編譯數據庫源代碼
- 16. 在從C#代碼調用dll函數時出錯代碼
- 17. 可以確定一個庫(.so)已經編譯了哪些gcc vesion?
- 18. 如何在編譯時在C#中運行一個函數或一段代碼
- 19. 在運行時編譯函數C++編譯時編譯的函數的數量
- 20. 如何將指針函數從C++導出到C#?
- 21. 在編譯C++代碼或x264本身時未找到libx264.so.146
- 22. 哪個共享庫.so是「g_signal_connect()」函數?
- 23. 在Ant中,如何指定要編譯的源代碼
- 24. 在C編譯庫時出錯#
- 25. 用C++編譯器編譯c代碼
- 26. 編譯C代碼
- 27. 如何編寫從彙編代碼調用的C函數
- 28. F#確實允許指定哪些函數在代碼中內聯?
- 29. 如何在編譯C++代碼時修復一些版本問題?
- 30. 在從Hackage下載Haskell綁定到c庫時指定gcc編譯器標誌
我認爲.def文件可用於此目的。 – ruslik 2010-12-17 00:32:50
@ruslik即窗口 – alternative 2010-12-17 00:47:31