C++ 项目中 C++/CLI dll 未解决的符号错误

Unresolved Symbol Errors for C++/CLI dll in C++ Project

我正在尝试一个非常简单的 C++/CLI 包装器实现,以允许遗留 C++ 代码引用 .Net 代码,如 described here。我只是试图让我的基本 C++/CLI 非托管(本机)objects 链接,甚至没有包括任何 managed/IL/.Net 代码。

我的问题是,按照这个基本设置和我在下面描述的内容,我对这些错误感到非常困惑是对的吗?我缺少一些考虑因素吗?也许答案是这应该有效,所以不清楚哪里出了问题。那还是有帮助的。一个类似的工作示例会很棒。

未解决的符号错误

Error LNK2019 unresolved external symbol "__declspec(dllimport) public: __thiscall Wrapper::Test::Test(void)" (__imp_??0Test@Wrapper@@QAE@XZ) referenced in function _main NativeApp

Error LNK2019 unresolved external symbol "__declspec(dllimport) public: __thiscall Wrapper::Test::~Test(void)" (__imp_??1Test@Wrapper@@QAE@XZ) referenced in function _main NativeApp

我已经查看了有关 SO 的相关问题,但没有任何运气。我的 dll header 包含在客户端 C++ 项目中,我的项目引用了 C++/CLI 包装器 dll,我的定义语句 import/export。我非常简单的代码如下所示。我没有使用任何 MFC。 我正在使用 VS2017DumpBin.exe /exports 显示似乎与链接器错误所说的内容相匹配的导出符号丢失。

      1    0 000010D0 ??0Test@Wrapper@@QAE@XZ = ??0Test@Wrapper@@QAE@XZ (public: __thiscall Wrapper::Test::Test(void))
      2    1 000010E0 ??1Test@Wrapper@@QAE@XZ = ??1Test@Wrapper@@QAE@XZ (public: __thiscall Wrapper::Test::~Test(void))
      3    2 000010C0 ??4Test@Wrapper@@QAEAAV01@ABV01@@Z = ??4Test@Wrapper@@QAEAAV01@ABV01@@Z (public: class Wrapper::Test & __thiscall Wrapper::Test::operator=(class Wrapper::Test const &))

这是基本代码...

NativeApp.exe(项目)


NativeApp.cpp(文件)

#include "stdafx.h"
#include <iostream>
#include "Wrapper.h" //From additional includes directory

int main()
{
    std::cout << "Program Started" << std::endl;
    Wrapper::Test shell = Wrapper::Test::Test(); //Use dll
    std::cin.get();
    return 0;
}

对包装器的引用


Wrapper.dll(项目)


Wrapper.cpp(文件)

#include "Wrapper.h"

#pragma unmanaged
namespace Wrapper {
    Test::Test() {
    }
    Test::~Test() {
    }
}

Wrapper.h(文件)

#pragma once

#ifdef WRAPPER_EXPORTS  
#define WRAPPER_API __declspec(dllexport)   
#else  
#define WRAPPER_API __declspec(dllimport)   
#endif  

#pragma unmanaged
namespace Wrapper {
    class WRAPPER_API Test {
    public:
        Test();
        ~Test();
    };
}

我的印象是项目参考在幕后处理了任何其他依赖项设置。显然,事实并非如此。 .lib 文件需要作为附加依赖项添加,as is described here. However, as described by this Microsoft document,当我使用非 /clr dll 时,一切都在没有附加依赖项的情况下工作,所以我不确定为什么只需要附加依赖项我的 CLR 参考。显然,我需要进一步阅读。

无论如何,下面列出了我的 C++ 客户端项目要求。我错过了第二个要求。另外,here is an example project 帮助我诊断了问题。

1.) 添加项目引用

2.) 添加 .lib 文件作为附加依赖项。

[可选] 使用 Additional Library Directories

3.) #include 代码中适当的 .h 文件

[可选] 使用额外的包含目录

编辑:为什么需要额外的依赖项,以及替代选项

如上所述,我对为什么 /clr dll 需要 .lib 附加依赖项而不是非 clr dll 感到困惑。答案是因为 /clr 项目默认配置为忽略导入库。因此,当项目被另一个 C++ 项目引用时,项目引用将忽略导入库。在 /clr dll 项目中将此设置(Linker > General > Ignore Import Libraries)更改为 "No" 即可解决问题,这样就不需要额外的依赖项,并且项目引用与非 clr C++ dll 的工作方式相同。