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。 我正在使用 VS2017。 DumpBin.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 的工作方式相同。
我正在尝试一个非常简单的 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。 我正在使用 VS2017。 DumpBin.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 的工作方式相同。