gpt4 book ai didi

c++ - 升级到 g++ 4.7(支持 c++11): any ABI incompatibility?

转载 作者:可可西里 更新时间:2023-11-01 09:45:56 33 4
gpt4 key购买 nike

在 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 上工作,对吗?如果程序的其余部分是使用最新的 g++ 编译器编译的,为什么由供应商创建的用于 MINGW 的静态库 chilkat-9.3.2/lib/libchilkat.a 会关心——这是 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.exeStarting program: test_chilkat.exe[New Thread 4704.0x1a44]Program received signal SIGSEGV, Segmentation fault.0x00404442 in CkObject::CkObject() ()

最佳答案

MinGW 4.6.2 肯定会生成不同的代码来调用 CkString构造函数比 4.7.2.

这是我用来将您的测试程序编译为汇编代码文件的命令行(其中 ./include 是 Chilkat header 的位置):

g++ -I ./include -S -masm=intel -std=gnu++0x test.cpp

这里是带注释的反汇编,由两个 printf()调用(GCC 生成为 puts() 调用)。

  • 4.6.2:

    call    _puts

    lea eax, [esp+28] ; eax gets pointer to `str1` being constructed
    mov DWORD PTR [esp], eax ; put the `str1` pointer on the stack
    call __ZN8CkStringC1Ev ; call `CkString::CkString()` ctor

    mov DWORD PTR [esp], OFFSET FLAT:LC1
    call _puts
  • 4.7.2:

    call    _puts

    lea eax, [esp+28] ; eax gets pointer to `str1` being constructed
    mov ecx, eax ; ecx gets `str1` "this" pointer
    LEHB0:
    call __ZN8CkStringC1Ev ; call `CkString::CkString()` ctor

    mov DWORD PTR [esp], OFFSET FLAT:LC1
    call _puts

如您所见,4.6.2 将“this”指针传递给堆栈上的构造函数(这是 Chilkat 库所期望的)。 4.7.2 在ecx中传递“this”指针.

好像是从4.7.0开始的。 MinGW 将 C++ 类成员调用约定更改为 __thiscall .参见 http://mingw-users.1079350.n2.nabble.com/MinGW-GCC-4-7-0-released-td7578133.html

看起来您可以使用 -mabi=sysv 覆盖默认值选项,这让你的测试程序对我有用:

C:\temp>g++ --version
g++ (GCC) 4.7.2
...

C:\temp>g++ -mabi=sysv -I ./include -g -Wl,--enable-auto-import test.cpp -o test.exe libchilkat-9.3.2.a

C:\temp>test
test chilkat
test done

但是,在更复杂的程序中使用其他库可能会给自己带来更多麻烦 - 例如,您几乎肯定需要重建 libstdc++.a至少。

我会向 Chilkat 开发人员施压以获得 4.7.x 库...

关于c++ - 升级到 g++ 4.7(支持 c++11): any ABI incompatibility?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13100324/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com