在 Windows 上,当使用 g++ 4.6 (mingw) 和 -std=c++0x 并与第三方静态库(由供应商提供用于 mingw 的)链接时,应用程序运行良好。当我切换到 g++ 4.7.2 (mingw) 以便可以使用 -std=c++11 时,应用程序构建良好,但运行时崩溃。如果我注释掉对供应商提供的库的调用,那么它不会崩溃。我询问了图书馆供应商的客户支持,并被告知不支持此功能。
我的问题是,在使用更新版本的 g++ 编译器时,“是否存在任何 ABI 不兼容性”?它不向后兼容吗?新版本的编译器不应该与现有和遗留的第 3 方静态库一起使用吗?
请注意,这只发生在 Windows (mingw) 平台上。在 Linux 上运行良好。
我已经添加了更多信息:
有没有人在 Windows 应用程序中使用过 Chilkat 的 MinGW C++(静态)库,其源代码是用 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("测试chilkat\n"); CKString str1; printf("测试完成\n"); }
gdb -i=mi test_chilkat.exe 启动程序:test_chilkat.exe [新线程 4704.0x1a44] 程序收到信号 SIGSEGV,分段错误。 0x00404442 在 CkObject::CkObject() ()