Windows では、g++ 4.6 (mingw) および -std=c++0x を使用し、サード パーティの静的ライブラリ (mingw で使用するためにベンダーから提供されたもの) とリンクすると、アプリケーションは正常に動作します。-std=c++11 を使用できるように g++ 4.7.2 (mingw) に切り替えたところ、アプリケーションは正常にビルドされますが、実行時にクラッシュします。ベンダー提供のライブラリへの呼び出しをコメントアウトすると、クラッシュしません。ライブラリ ベンダーのカスタマー サポートに問い合わせたところ、これはサポートされていないと言われました。
私の質問は、新しいバージョンの g++ コンパイラに移行するときに「ABI の非互換性はありますか?」ということです。後方互換性はないのですか?コンパイラの新しいバージョンは、既存および従来のサードパーティの静的ライブラリで動作するはずではありませんか?
これは Windows (mingw) プラットフォームでのみ発生することに注意してください。Linux で問題なく動作します。
これに関する詳細情報を追加しました:
ソースが -std=c++11 コンパイル オプションを指定して g++ 4.7.2 でコンパイルされた Windows アプリケーションで Chilkat の MinGW C++ (静的) ライブラリを使用した人はいますか? 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("チルカットのテスト\n"); CkString str1; printf("テスト完了\n"); }
gdb -i=mi test_chilkat.exe 起動プログラム: test_chilkat.exe [新しいスレッド 4704.0x1a44] プログラム受信信号 SIGSEGV、セグメンテーション違反。 CkObject::CkObject() () の 0x00404442