我提到这个有点类似的问题 https://stackoverflow.com/questions/3994073/calling-a-function-from-a-win32-lib-project-with-clr-from-a-project-that-is-a在问这个之前,但无法解决我的问题
我正在查看一个包含许多解决方案的旧应用程序。问题出现在其中一个解决方案中(比如 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:“私有:__thiscall type_info::type_info(class
type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已在中定义
libcmtd.lib(typinfo.obj)
错误 LNK2005:“私有:类 type_info 和 __thiscall
type_info::operator=(class type_info const &)"
(??4type_info@@AAEAAV0@ABV0@@Z) 已在中定义
libcmtd.lib(typinfo.obj)
错误LNK1169:找到一个或多个多重定义的符号
许多在线论坛(包括本网站)均出现此错误。但不知何故,在尝试这些选项后我无法修复它(我是 .NET 框架的新手)。
重要的一点是,即使我从 P2 中删除 C# 代码,也会出现相同的错误。
正确的修复方法是什么?
Update:
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 可以使解决方案编译良好)。
我正在编译 P1 和 P2/MD[d]
选项。而上面的错误是P1抛出的。
如果我将 P2 从静态库(.lib)制作为动态链接库(.dll),那么上述错误就会消失。新的链接器错误来自foo
本身用于未定义的参考:
错误 LNK2019:无法解析的外部符号“public:void __cdecl
Class::foo()" 在函数 { P1 的某个函数 } 中引用