我正在为非托管 C++ 库编写 CLR 包装器。
我从非托管库中包含了两个文件:
//MyCLIWrapper.h
#include "C:\PATH\TO\UNMANAGED\Header.h"
#include "C:\PATH\TO\UNMANAGED\Body.cpp"
Run Code Online (Sandbox Code Playgroud)
然后我正在为非托管库函数编写 CLI 实现:
//MyCLIWrapper.h
// includes ...
void MyCLIWrapper::ManagedFunction()
{
UnmanagedFunction(); // this function is called successfuly
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我的非托管函数包含对其他非托管头文件中定义的其他函数的调用。这会导致编译器链接错误。
如果我将包含添加到定义这些函数的非托管头文件中,我的错误就会得到解决。但是,有很多功能,并且需要很多包含。
有没有不同的方法来解决这个问题?
编辑: PS 我的托管代码位于单独的 Visual Studio 项目(输出 - DLL)中,并且编译设置设置为 /CLR。非托管代码位于单独的 Win32 项目(输出 - DLL)中。
此外,经过更多研究后,我得出的结论是,理论上我可以将我的 Win32 非托管项目设置为 CLR,并在其中添加我的托管类和头文件作为入口点,然后它们将全部编译为单个 DLL 文件。这可能会解决(?)链接错误。但是,我更愿意保留松散耦合以及将我的非托管项目设置为 CLR 可能引发的其他一系列问题。
编辑#2: 我引用的非托管类(body.cpp、header.h)包含所需文件,这些文件定义了导致问题的函数。但是,我的托管代码不接受非托管 body.cpp 和 header.h 中的包含。
链接器错误与编译器错误不同。您忘记记录您看到的确切链接器错误,但是当您使用 /clr 编译代码时,一个非常常见的事故是非 C++ 成员函数的默认调用约定发生了变化。默认值为 __clrcall,这是针对托管代码优化的约定。虽然没有 /clr 编译的函数默认为 __cdecl。这改变了函数名称被破坏的方式。您在链接器错误消息中看到这一点,表明它正在寻找 __clrcall 函数但找不到它。
您需要使用 __cdecl 在 .h 文件中显式声明您的函数。或者告诉编译器这些函数不是托管代码。哪个是解决它的最佳方法:
#pragma managed(push, off)
#include "unmanagedHeader.h"
#pragma managed(pop)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5899 次 |
| 最近记录: |