私の観察: C++ リンカ (具体的には Visual Studio) は __declspec(dllimport) を真剣に受け止めます。リンカは、添付されたライブラリのみで、このディレクティブで宣言されたクラス/関数の定義を検索します。(ローカルに存在する定義を無視します)。__declspec(dllimport) ディレクティブの優先順位を下げて、リンカーが他の場所を探す前にローカルに存在する定義を最初に考慮するようにしたいと考えています。そうすることは可能ですか?また、Windows 固有/Visual Studio 固有の問題ですか? もしそうなら、回避策はありますか?
Windows の Visual Studio 2015 でコンパイル済みの MathGL-v2.4.2 バイナリを使用しようとしたときに、この問題が発生しました。
最初のビルドで多くのリンカー エラー 2019: unresolved external symbol __declspec(dllimport) _cdel mglGraph::mglGraph(void).... 何とか何とかが発生しました。
さらに、ライブラリ コードを調べて、すべてのクラスと構造体の定義が次の形式であることを確認しました。
class MGL_EXPORT mglGraph {
// some variables and
// Full function definitions
// (also contains some inline functions)
};
MGL_EXPORT が次のように定義されている場合、
/* in dllexport.h the following is declared */
# ifdef mgl_EXPORTS
/* We are building this library */
# define MGL_EXPORT __declspec(dllexport)
# else
/* We are using this library */
# define MGL_EXPORT __declspec(dllimport)
# endif
また、libmgl.dll Exported Symbols を調べましたが、リンカーが探しているシンボルが存在しません (したがって、当然、リンカーは未解決のシンボル エラーを返します)。
上記のすべてから、結論: リンカーはクラス/関数のローカル定義を無視し、__declspec(dllimport) ディレクティブで宣言されたクラス/関数の関数定義の添付ライブラリのみを検索します。
さらなる証拠: 完全に定義された関数/クラスの定義から MGL_EXPORT を削除すると、コードがコンパイルされます
質問は次のとおりです。これはプラットフォーム固有の問題ですか? はいの場合、回避策はありますか?(MGL_EXPORT ディレクティブを削除する前に、すべての関数が完全に定義されていることを確認するために、ライブラリ内のすべてのクラスを注意深く調べるのは非常に面倒です)。
「__declspec(dllimport) ディレクティブの優先度を下げて、リンカーが他の場所を探す前にローカルに存在する定義を最初に考慮するようにしたい」 これは非常にエレガントに問題を解決します。