関数名で「動的に」関数ポインターを取得するCプログラムがあります(つまり、関数名を文字列として渡し、関数へのポインターを取得します)。私はすでにdlopenとdlsymを使用してLinuxでこれを行っており、dlfcnを使用した他のUnixライクでも機能すると思います。
MinGWを使用してこのプログラムをWindowsに移植しようとしたときに、問題が発生しました。「GetProcAddress(handle、symbol_name)」を使用して名前を検索しようとすると、「symbol_name」はコールバック関数の名前であり、「handle」は「GetModuleHandle(NULL)」によって返される現在の実行可能ファイルへのハンドルです。何も取得されません。 MinGWの名前マングリングは、シンボル名に「_」を追加するためです。
明らかな解決策(必要な記号の前に「_」を付ける)は、移植性にとって少し「危険」に思えます(コンパイラーがそれらのいくつかに2つのアンダースコアを追加する可能性がありますか?わかりません)。
コンパイラが私のシンボルに名前を付けないようにするためのより良い方法はありますか?(またはそれらのサブセット、動的に検索する必要があるコールバックのみ);
または、GetProcAddressに、マングルされた場合でもそれらを検出させる方法はありますか?
オプション-fno-leading-underscoreも試しましたが、すべての外部シンボルのマングリングも削除され、プログラムをstdlibなどとリンクできなくなりました(また、ドキュメントの警告は少し怖いです)。
また、純粋なCを使用していることに注意してください(コードのどの部分にもC ++はありません)。また、すべてのコードは単一の「.exe」に含まれています。
TIA