前段時間工作中要為android編譯跨平台的第三方庫,遇到了arc4random有關函數的“static declaration follows non-static declaration”問題,那是因為ndk提供的運行庫對arc4random支持不一樣,或只支持其它某幾個函數或只支持其它另個幾個函數,而第三方庫的自動配置腳本遇見的要么全支持要么全不支持,提供了一份靜態實現的代碼。這是函數在運行庫頭文件中聲明之后在實現代碼中又聲明了靜態。解決也只能是每個cpu體系版本手動修改了。
今天在編譯openssl 0.98b版也遇到這個錯,這次是變量。下面就是這個元凶的真身:
OPENSSL_IMPLEMENT_GLOBAL。
它想將變量名的變量隱藏成靜態,導出一個訪問函數,並且宏的使用可以對變量初始化,宏的結尾是沒有";"封閉語句。
OPENSSL_IMPLEMENT_GLOBAL(int, some_var) = 1;你get到了嗎。
然而卻來了一個顯式extern聲明,然后引用, 最后來static定義並初始化。
沒有IDE分析項目,找一個宏還真不好找,編譯出錯時,並不會提示宏在那里定義,只是指着宏有錯,你還不知道這個宏是什么用意。雖然可以遍歷目錄從文件中找匹配字。