考慮我的小例子C庫:獲得GCC鏈接器警告多個函數定義
#include <external_library.h>
void some_function(void)
{
external_library_call();
// Do other stuff...
}
它計劃使some_function()調用公開。但是,該庫不起作用,因爲它需要的外部庫也恰好使用了一個名爲some_function()的函數,該函數恰好具有相同的原型。儘管如此,GCC的鏈接器並不在乎有多少some_function符號來源。它從表面上隨機挑選一個,外部庫可能會或可能不會使用我的some_function()而不是它自己的。瘋了吧。不是圖書館不工作的事實。這個庫肯定不應該工作。事實上,符號'some_function'有兩個來源,但鏈接程序對此不做任何事情。而且你知道,這並不會讓我感到困擾,因爲我已經習慣了GCC和C,一般在病態上都是魯莽的。但是,有一種方法可以讓鏈接器在相同符號有兩個來源時提醒我。我已經嘗試過--Wall -Wextra -Wshadow,但是不會產生任何警告。
請注意,-fvisibility = hidden在這裏沒有幫助,因爲這兩個庫都希望導出some_function()。我知道你可以對我進行函數調用時沒有一個唯一的前綴而感到羞恥。你是對的。這是一個錯誤。我不在乎。這個錯誤可以被鏈接器捕獲,所以應該被捕獲。沒有理由爲什麼鏈接器不應該捕獲這個錯誤。此外,您使用的庫可能會導出一些奇怪的意外符號,並且您不一定能控制其他人的庫導出內容。只有在程序員停止並着火之前,前綴和前綴才能變得非常獨特。
如果我正確讀取這個,我還必須在main()前面添加__attribute __((visibility(「default」)))來導出它。正確? – enigmaticPhysicist
@enigmaticPhysicist我不這麼認爲。 main()似乎被GCC專門處理並始終導出。 –
雖然這是非常有用的,我一定會使用它,它不能解決原來的問題。鏈接器/知道/有相同符號的兩個單獨的實例。爲什麼它沒有停下來併發生錯誤?爲什麼選擇一個而不是另一個?什麼標準?如果我需要導出一個符號,並且我想確保它不會與我正在使用的任何其他符號相沖突,那該怎麼辦?我仍然稱這個問題沒有解決,直到我可以讓鏈接器在這種情況下停止出現錯誤。 – enigmaticPhysicist