実現したいこと
Visual StudioのC++から、MSYS2(Mingw64)でビルドされたDLL内のstatic関数を呼び出したいです。
前提
- Windows 11 PCで開発しています
- MSYS2はgcc version 14.2.0 (Rev2, Built by MSYS2 project)を使っています
- Visual Studio 2022を使っています
- 公開したいクラス及び関数は次です
cpp:公開したいクラス及びメンバ関数
1#if defined(WIN32) || defined(_WIN32) 2 #ifdef UTILITY_EXPORTS 3 #define DECLSPEC __declspec(dllexport) 4 #else 5 #define DECLSPEC __declspec(dllimport) 6 #endif 7#else 8 #define DECLSPEC 9#endif 10 11class /* DECLSPEC */ CoordinateUtil 12{ 13public: 14 DECLSPEC void showMessage(); 15 DECLSPEC static void latLonToUTM(double lat, double lon, double& utmX, double& utmY); 16};
発生している問題・エラーメッセージ
- MSYS2側で__declspec(dllexport)を、Visual Studio側で__declspec(dllimport)をメソッド宣言に付与しても次のエラーになってしまいます。関数が公開されてもマングリングされてしまうことが原因と思われます。
- 未解決の外部シンボル "__declspec(dllimport) public: void __cdecl CoordinateUtil::showMessage(void)" (_imp?showMessage@CoordinateUtil@@QEAAXXZ) が関数 main で参照されました
- MSYS2側でnmしてシンボルを確認してみたところ、「_imp?showMessage@CoordinateUtil@@QEAAXXZ」とは別の名称でした。見つからないはずです
- classとメソッド両宣言にDECLSPECを付与した場合、Visual Studio側で次のエラーになります
- エラー「dll インターフェイス クラスのメンバーを dll インターフェイスと共に宣言するのは無効です。」
- 次に示すウェブページを参考にして公開したいクラスを取得する関数を使うとCoordinateUtilのインスタンスは取得でき、showMessage()は呼び出せます
- https://qiita.com/fan2tamo/items/8f110a22d47cb684f33d
- が、ご存じの通りC++の文法上static関数は抽象クラスで宣言できないため、この方法では呼び出せません
MSYS2(Mingw64)で作成したC++ staticメンバ関数をVisual Studioで使用する方法はあるのでしょうか?
