opencv CV_EXPORTS含義

在剛開始閱讀opencv 源碼時,經常會遇到結構體、類後面跟着一個CV_EXPORTS。如
在這裏插入圖片描述

在跟蹤到它的定義後瞭解到它的含義:

在這裏插入圖片描述
在編譯過程中,根據你的平臺選擇對應的宏定義
windows平臺下爲

__declspec(dllexport)

linux平臺下爲

__attribute__ ((visibility ("default")))

都是用於控制動態庫的導出符號。windows平臺下的.dll庫文件,Linux下的.so文件,這些動態庫中都有很多的函數,有些函數需要被庫外調用,也就是我們說的 接口 ,但動態庫中不是所有的函數、類、變量、模板都需要被庫外調用的,一個動態庫的導出列表越少,動態庫加載和識別的符號越少,程序啓動和運行的速度就越快,導出所有的符號通常會導致程序變慢,並佔用大量內存。

我們通常希望動態庫只需要給出需要被外部調用的接口就可以了,編譯器怎麼判斷這個函數、類、變量、模板需要被外部調用呢?這個時候就出現了這個標識屬性。.dll文件中是__declspec(dllexport)。.so文件中是__attribute__ ((visibility (“default”)))。

在Linux下動態庫(.so)中,通過GCC的C++ visibility屬性可以控制共享文件導出符號。在GCC 4.0及以上版本中,有個visibility屬性,可見屬性可以應用到函數、變量、模板以及C++類。

“default”:用它定義的符號將被導出,動態庫中的函數默認是可見的。”hidden”:用它定義的符號將不被導出,並且不能從其它對象進行使用,動態庫中的函數是被隱藏的。default意味着該方法對其它模塊是可見的。而hidden表示該方法符號不會被放到動態符號表裏,所以其它模塊(可執行文件或者動態庫)不可以通過符號表訪問該方法。

要定義GNU屬性,需要包含__attribute__和用括號括住的內容。可以將符號的可見性指定爲visibility(“hidden”),這將不允許它們在庫中被導出,但是可以在源文件之間共享。實際上,隱藏的符號將不會出現在動態符號表中,但是還被留在符號表中用於靜態鏈接。

導出列表由編譯器在創建共享庫的時候自動生成,也可以由開發人員手工編寫。導出列表的原理是顯式地告訴編譯器可以通過外部文件從對象文件導出的符號是哪些。GNU用戶將此類外部文件稱作爲”導出映射”。

參考資源:
https://blog.csdn.net/fengbingchun/article/details/78898623

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章