12月
15
その5の続き
とてもダメそうな気がしますが、C++ の例外は使えるでしょうか。
その5の結果からクラスオブジェクトが扱えるとは思えないので、とりあえず int
でも throw
してみます。
umezawa@selene ~$ cat extest1_callee.cc extern "C" void foo() { throw int(1); } umezawa@selene ~$ cat extest1_main.cpp #include <stdio.h> extern "C" void foo(); int main(void) { try { foo(); } catch (int i) { printf("%d\n", i); } return 0; } umezawa@selene ~$ g++ -o extest1_callee.obj -c extest1_callee.cc
c:\cygwin\home\umezawa>cl /EHsc extest1_main.cpp extest1_callee.obj Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86 Copyright (C) Microsoft Corporation. All rights reserved. extest1_main.cpp Microsoft (R) Incremental Linker Version 14.00.24215.1 Copyright (C) Microsoft Corporation. All rights reserved. /out:extest1_main.exe extest1_main.obj extest1_callee.obj extest1_callee.obj : error LNK2019: 未解決の外部シンボル __ZTIi が関数 _foo で参照されました。 extest1_callee.obj : error LNK2019: 未解決の外部シンボル ___cxa_allocate_exception が関数 _foo で参照されました。 extest1_callee.obj : error LNK2019: 未解決の外部シンボル ___cxa_throw が関数 _foo で参照されました。 extest1_main.exe : fatal error LNK1120: 3 件の未解決の外部参照 c:\cygwin\home\umezawa>
リンクできません。
これ、throw
しようとするところで既にダメなので、呼ばれた側が例外を漏らさないように書いてもダメです。 libgcc.a や libgcc_eh.a を追加してもやっぱりダメでした。諦めましょう。
その7に続く
Windows 上での Visual C++ と GCC/Clang の相互運用(その7)
その6の続き 今までずっと x86 を試していましたが、 x64 ではどうでしょうか。 処理系は以下のようになります。 Windows 7 64bit Visual Studio 2015 / MS-C for x64 Cygwin 64bit + gcc-core 5.4.0-1 32bit の Cygwin…