その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に続く

Trackback

only 1 comment untill now

  1. 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…

Add your comment now