これを尋ねる前に、このやや似た質問を参照しましたが、問題を解決できません
多くのソリューションを備えた古いアプリケーションを見ています。問題は、ソリューションの 1 つ (たとえば S) で発生しています。状況は次のとおりです。
- S 内のプロジェクト (P1 など) にはすべての C/C++ ファイルがあり、C# 関数を呼び出す必要があります
- P1 には .c ファイルも含まれているため、それで
/clr
オプションを使用することはできません - P1 の .c ファイルを .cpp ファイルとしてコンパイルすると、多くのエラーが生成されます。そのレガシー .c ファイルのソースを変更するつもりはありません。
- そこで、有効にして別のプロジェクト (P2 など) を
/clr
作成し、関数宣言用のヘッダー ファイルと関数定義用の .cpp ファイルを作成しました。C# 呼び出しはその下で行われます。P2 は正常にコンパイルされます - P1 は .dll であり、P2 はスタティック ライブラリとして作成されることに注意してください。
- P2 は、P1 の「フレームワークと参照」の下に記載されています。
そして警告:
警告 LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合します。/NODEFAULTLIB:ライブラリを使用
これらすべてで、P1 で 3 つのリンカー エラーが発生します。
エラー LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) libcmtd.lib(typinfo.obj) で既に定義されています
エラー LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) libcmtd.lib(typinfo.obj) で既に定義されています
エラー LNK1169: 1 つ以上の多重定義シンボルが見つかりました
このエラーは、この Web サイトを含む多くのオンライン フォーラムで入手できます。しかし、どういうわけか、これらのオプションを試した後、修正できません(.NETフレームワークは初めてです)。
重要な点は、P2 から C# コードを削除しても、同じエラーが表示されることです。
それを修正する正しい方法は何ですか?
更新:
P2 には、関数宣言を含む 1 つのヘッダー ファイルと、C# メソッドへの 1 行の呼び出しである関数定義を含む 1 つのソース ファイルが含まれています。例えば
void Class::foo () { // A static function inside Class
std::string x = marshal_as<std::string>(C#_function);
// ...
}
P2 が新たに追加されてコンパイルされます/clr
(P2 を削除すると、ソリューションが正常にコンパイルされます)。
オプション付きで P1 と P2 の両方をコンパイルしてい/MD[d]
ます。そして、上記のエラーは P1 によってスローされます。
P2 をスタティック ライブラリ (.lib) からダイナミック リンク ライブラリ (.dll) にすると、上記のエラーはなくなります。そして、foo
未定義の参照のために、新しいリンカーエラーが発生します。
エラー LNK2019: 未解決の外部シンボル "public: void __cdecl Class::foo()" が関数 {P1 の関数} で参照されています