在Linux上編譯Qt的時候configure出來的Makefile傳遞給g++的參數visiblility=hidden,然后就會調用Qt庫所使用的第三方庫libpng庫源代碼函數聲明添加上__attribute__ ((visibility("hidden"))),這個函數我這里是png_set_filter
這個gcc擴張的意思就是把編譯出來的函數符號設為隱藏,Qt設計者的意圖是想不讓其他外部庫鏈接使用這個libpng,只給Qt自己使用。這就造成了項目使用的第三方庫ImageMagick因為本身也用到了libpng,可能也去引用了png_set_filter也去鏈接這個函數符號,這個函數符號本身是設置為“不可見”的,一旦外部庫一引用,所以就報錯了。
如果要流氓式的解決問題,可以在函數聲明前面加上:
__attribute__ ((visibility("default")))
這樣,函數符號就被“導出”了,當然,與windows上DLL的導出表不一樣。
references:
https://gcc.gnu.org/wiki/Visibility
http://blog.csdn.net/xiayu0912/article/details/6236724