0

gcc バージョン 4.7.2 を使用して Windows DLL を作成しようとしていますが、内部で例外を使用すると問題が発生します。DLL コードtest()で、同じメソッドでキャッチされたメソッドで見つかった例外をスローしています。以下は、main.cpp にあるコードです。

#include <cstdlib>
#include <windows.h>
#include <iostream>
#include "dllexport.h"

using namespace std;

ADDAPI int test()
{
    try
    {
        throw 2;
    }catch(...)
    {
        std::cout << "Caught";
        return 1;
    }
    return 0;
}

//Link to correct DllMain if C++ is used
#ifdef __cplusplus
extern "C"
#endif
BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD  reason, LPVOID lpReserved)
{
    switch (reason)
    {
        case DLL_PROCESS_ATTACH:
        break;
        case DLL_THREAD_ATTACH:
        break;
        case DLL_THREAD_DETACH:
        break;
        case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

および dllexport.h にある関連するヘッダー

#ifndef DLLEXPORT_H
#define DLLEXPORT_H

/* Define calling convention in one place, for convenience. */
#define ADDCALL __stdcall

/* Usually format is ADDAPI int ADDCALL Add(int a, int b)...
   but moving ADDCALL near ADDAPI works in gcc */

/* You should define BUILDING_DLL *only* when building the DLL. */
#ifdef BUILDING_DLL
  #define ADDAPI __declspec(dllexport) ADDCALL
#else
  #define ADDAPI __declspec(dllimport) ADDCALL
#endif

#ifdef  __cplusplus
extern "C" {
#endif

    ADDAPI int test();

#ifdef  __cplusplus
}
#endif

#endif  /* DLLEXPORT_H */

これは正常にコンパイルされますが、リンクしているプロセスからテスト メソッドを呼び出そうとすると、次のエラーが返されます。

このアプリケーションは、異常な方法で終了するようランタイムに要求しました。

次を使用してdllをコンパイルします。

g++ -c main.cpp -O3 -DBUILDING_DLL
g++ -o mydll.dll main.o -shared -static-libgcc -static-libstdc++ -Wl,--add-stdcall-alias

さらに、 を使用してクライアント アプリケーションをコンパイルします-lmydll。DLL から例外をスローしてプロセスでキャッチするのは危険であることは理解していますが、例外はすべて DLL の内部で処理されるため、そうしていません。

私は何を間違っていますか?

編集:

libstdc++ の DLL への静的リンクを削除すると、問題が解決します。ただし、自己完結型にするために、DLL がすべての依存関係を内部的に解決することが理想的です。上記を達成するにはどうすればよいですか?

4

1 に答える 1

0

私は同じ問題に直面しており、以下の行でもクライアントアプリケーションをコンパイルする必要があったようです

-static-libstdc++ -static-libgcc

それが機能するために。

于 2015-03-10T17:47:37.197 に答える