我在问这个之前提到了这个有点相似的问题,但无法解决我的问题
我正在查看具有许多解决方案的旧应用程序。问题发生在其中一种解决方案中(比如 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:library
现在有了所有这些,我在 P1 中得到 3 个链接器错误:
错误 LNK2005:“私有:__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:找到一个或多个多重定义的符号
此错误可在包括本网站在内的许多在线论坛上找到。但不知何故,在尝试了这些选项后我无法修复它(我是 .NET 框架的新手)。
重要的一点是,即使我从 P2 中删除了 C# 代码,也会出现相同的错误。
修复它的正确方法是什么?
更新:
P2 只包含 1 个带有函数声明的头文件和 1 个带有函数定义的源文件,这是对 C# 方法的 1 行调用;例如
void Class::foo () { // A static function inside Class
std::string x = marshal_as<std::string>(C#_function);
// ...
}
新添加了 P2 以进行编译/clr
(删除 P2 使解决方案编译良好)。
我正在使用/MD[d]
选项编译 P1 和 P2。上面的错误是P1抛出的。
如果我将 P2 从静态库 (.lib) 制作为动态链接库 (.dll),那么上述错误就会消失。新的链接器错误来自于foo
未定义的引用本身:
错误 LNK2019:未解析的外部符号“public:void __cdecl Class::foo()”在函数 { P1 的某个函数} 中引用