簡單的理解,就是乙個exe檔案需要用到其他dll檔案,如果我們不重新編譯鏈結exe,替換乙個新的dll,而執行正常,則稱為二進位制相容良好。
這種應用場景很多,例如,發布新的補丁程式,只給客戶公升級極少的dll檔案,而多數的exe,dll都不用更新了。
不幸的是,不隨願的情況也很多。
場景一:
dll的原始碼 int __cdecl add(int,int);
dll的二進位制程式入口 ?add@@yahhh@z
exe的原始碼 int x = add(1,2);
exe要尋找的入口
?add@@yahhh@z
此時:dll和exe配合良好
dll的新修改的原始碼 int __cdecl add(int,int,int c=0);
dll的入口(假設它重新編譯鏈結)
?add@@yahhhh@z
exe的原始碼int x = add(1,2);
exe要尋找的入口(假設它未重新編譯鏈結)?add@@yahhh@z
此時:dll提供的入口和exe想進入的入口不一致了。
最新的F 破壞了二進位制相容性
微軟在 vs 2010 beta 1中包含了f 並發布了對應的用於vs2008的ctp更新。最新的二進位制版本1.9.6.16,和之前的版本1.9.6.2不相容,意味著所有之前的 都需要重新編譯。微軟不僅把f 新增到vs 2010 beta 1中以實現2007年許下在visual studio中包含...
二進位制相容問題
二進位制相容問題,主要是針對動態鏈結庫而言的。在windows上就是dll,在linux上就是so。如果主程式exe 當然也可以是客戶庫 不變,公升級了依賴庫so1到so2,而不需要重新編譯,那麼就是說so2是相容so1庫的。二進位制相容涉及到編譯問題,所以和硬體平台,軟體平台以及編譯器等都是密切相...
c 二進位制相容本質
總的一條就是讓client只依賴 名字 而不依賴任何 實現 實現 具體的就是2類 1 函式體,code 2 任何記憶體塊大小,layout細節 為什麼會有二進位制相容問題,就是因為一般的c 標頭檔案並不是單純的介面宣告,其中也還包括了 實現細節 因為成員變數就是一種記憶體layout,就屬於實現細節...