在Windows上,當使用g ++ 4.6(mingw)和-std = C++ 0x並且與第三方靜態庫(供應商提供的mingw使用)進行鏈接時,該應用程序可以正常工作。當我切換到g ++ 4.7.2(mingw)以便我可以使用-std = C++ 11時,應用程序生成良好,但運行時崩潰。如果我註釋掉對供應商提供的庫的調用,那麼它不會崩潰。我詢問了圖書館供應商的客戶支持,並被告知這不被支持。升級到g ++ 4.7(支持C++ 11):任何ABI不兼容?
我的問題是,「有沒有任何ABI不兼容」,當轉到更新版本的g ++編譯器?它不向後兼容嗎?新版本的編譯器是否應該與現有的和傳統的第三方靜態庫一起工作?
請注意,這隻發生在Windows(mingw)平臺上。在Linux上運行良好。
我增加了更多的信息在這:
有沒有人使用奇爾卡特的MinGW的C++在Windows應用程序的源編譯使用g ++ 4.7.2與-std = C++ 11的編譯選項(靜態)庫?當訪問Chilkat api時,該應用程序崩潰(例如CkString對象被實例化)。適用於g ++ 4.6.2(我使用std = C++ 0x)。 在使用g ++ 4.7.2的Linux上,此程序正常工作。如果從4.6.2移動到4.7.2時存在ABI不兼容問題,那麼它也不適用於Linux,對吧?爲什麼供應商爲了和MINGW一起使用而創建的靜態庫chilkat-9.3.2/lib/libchilkat.a會關心程序的其餘部分是否使用最新的g ++編譯器編譯---這是ABI中的MINGW特定更改嗎?
#include <windows.h> #include <stdio.h> #include <CkString.h> int main(int argc, char *argv[]) { printf("test chilkat\n"); CkString str1; printf("test done\n"); }
gdb -i=mi test_chilkat.exe Starting program: test_chilkat.exe [New Thread 4704.0x1a44] Program received signal SIGSEGV, Segmentation fault. 0x00404442 in CkObject::CkObject()()
是的。請參閱http://gcc.gnu.org/gcc-4.7/changes.html我相信這是一個僅限於庫的更改(特別是在std :: list和std :: pair中)並且僅影響C++ 11模式。 – dajames
那麼,GCC 4.7.2實際*恢復* ABI與GCC 4.6的兼容性。所以OP在這裏遇到的可能是不同的。 –
Linux ABI兼容性和Windows ABI兼容性完全不同。一般來說,我不指望任何Windows GCC版本來維護任何類型的ABI。 – rubenvb