0

1)ソリューションには 2 つのプロジェクトが含まれます。プロジェクト 2 はプロジェクト 1 に依存します (「プロジェクトの依存関係」チェック ボックス グループでチェックされます)。プロジェクト 1 の一部のクラスは宣言および実装されていますが、コードでは使用されていません (インスタンスが作成されます)。これらのクラスを lua で使用するには、luabind を使用してバインドします。バインディング関数は、バインドする必要がある各クラスの静的メソッドとして宣言されます。cpp のコードを使用して自動的に呼び出され、「const bool is_bound = ClassName::Bind()」のようなものを使用します。ビルド結果は、プロジェクト 1 の静的ライブラリとプロジェクト 2 の実行可能ファイルです。

すべてのクラスがバインドされており、スクリプトで使用できます。

2)プロジェクト 2 に依存するプロジェクト 3 を追加しました。プロジェクト 2 のビルド結果は静的ライブラリであり、プロジェクト 3 のビルド結果は実行可能です。その結果、プロジェクト 1 で定義されたすべてまたは一部のクラスが、バイナリにまったくリンクされていません。問題 - プログラムを起動した後、それらはバインドされず、スクリプトで使用できません。

この問題はどのように解決できますか? また、その原因は何ですか? 前もって感謝します。

PS 「使用の模倣」による強制リンクを使用して手動で解決しようとしました(実験として)。私はこのような関数を使用しました(私は知っています、それは完全に醜いです)

template <class T, class A1, class A2>
void ForceLinking()
{
   boost::function<void(A1, A2)> f =
       boost::bind<T>(boost::lambda::constructor<T>(), _1, _2);
}
ForceLinking<ClassName, const string&, bool>();

その結果、パーツがリンクされ始め、他のパーツはリンクされなくなりました。

4

1 に答える 1

0

Visual Studio が EXE または DLL をリンクすると、すべての静的オブジェクトがメイン プロジェクトに含まれ、メイン プロジェクトのすべてのエクスポートされた関数が含まれる傾向があります。次に、そのプロジェクトと追加されたライブラリの依存関係をトレースします。

参照されたライブラリの静的オブジェクトを取得しません。これはおそらくバグと呼ばれる必要があります。これを乗り越えるには、メイン プロジェクトで目的のオブジェクトを明示的に参照する必要があります。実際には、オブジェクト ファイルを参照するだけでよく、残りはリンカーが処理します。

私は Google Test でこの問題に遭遇しました。私が学んだ解決策は次のようなものです: lib プロジェクトの影響を受ける各ソース ファイルに、次を追加します。

int LinkFileName() { return 0; }

DLL または EXE プロジェクトの任意のファイルに、次を追加します。

int linkFileName = LinkFileName();

それはかなりばかげていますが、うまくいきます。

于 2012-02-16T14:49:22.023 に答える