我正在尝试在C ++ / CLI中做一些非常简单的事情,但是我遇到了Visual Studio的问题,我无法弄清楚原因。
我有两个项目,一个包含名为JNIUtils.h的头文件。它的内容非常准确 -
#pragma once
class JNIUtils
{
public:
JNIUtils( void );
~JNIUtils( void );
};
它的实现也非常简单 -
#include "stdafx.h"
#include "JNIUtils.h"
JNIUtils::JNIUtils( void )
{
}
JNIUtils::~JNIUtils( void )
{
}
我要做的就是在另一个项目中创建这个新定义类型的对象。在我包含此头文件的项目中,我已经去了
项目属性>配置属性> VC ++目录>包括目录
我添加了一个条目,其中包含我所包含的头文件所在的路径(JNIUtils.h)
CPP文件我正在尝试创建此对象的实例,其外观如下:
#include "stdafx.h"
#include "JNIUtils.h"
using namespace System;
int main(array<System::String ^> ^args)
{
JNIUtils *util = new JNIUtils();
Console::WriteLine(L"Hello World");
return 0;
}
当我尝试编译时,我收到以下错误:
Error 3 error LNK1120: 2 unresolved externals C:\zcarter\UDK\WebSvcClients\Debug\JNITester.exe JNITester
Error 2 error LNK2019: unresolved external symbol "public: __thiscall JNIUtils::JNIUtils(void)" (??0JNIUtils@@$$FQAE@XZ) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) C:\zcarter\UDK\WebSvcClients\JNITester\JNITester.obj JNITester
Error 1 error LNK2028: unresolved token (0A000009) "public: __thiscall JNIUtils::JNIUtils(void)" (??0JNIUtils@@$$FQAE@XZ) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) C:\zcarter\UDK\WebSvcClients\JNITester\JNITester.obj JNITester
谁能告诉我这里我做错了什么?
答案 0 :(得分:7)
当您想将项目中的类用于另一个项目时,您需要做两件事:
1)将库编译代码(.lib)链接到主应用程序代码。
如果您有vs2010,只需在Project->Properties->Common->References
部分添加项目,即可完成所有艰苦的工作。
如果您有vs2008或更低版本,则必须将项目添加到Project->Dependencies...
中的依赖项。然后,进入Project->Properties->Linker->Input
并将.lib文件添加到现有的.dll列表中。使用相对路径,以便在其他计算机上运行。请注意,vs2008中还有一个Reference
部分,但我相信它只适用于CLR程序集。
2)将标题添加到包含目录
您已经确定了该部分,但我建议您将它们添加到Project->Properties->C++->Additional Include Directories
,因为您使用的方法不会在另一台计算机上运行,除非它们与您进行相同的配置。
答案 1 :(得分:1)
问题的关键在于您尝试在另一个项目中使用此对象。
要做到这一点,你必须将类编译成一个类库(我建议在这里静态),然后在第二个程序的编译器设置中链接这个库。实际上这有点乏味,但尝试很好!
请注意,此处有两个单独的“链接”。您的代码中包含一个头文件;和链接器中的一个(在编译器之后发生)链接目标文件(现在位于静态库文件中)。
答案 2 :(得分:0)
就我而言,错误消息显示 LNK2019 unresolved external symbol __imp_someFunctionName referenced in function ...
,我发现函数名称的前缀 __imp_
表示程序使用的是 __declspec(dllimport)
,而不是 __declspec(dllexport)
。
所以我给 Project->Properties->Configuration Properties->C/C++->Preprocessor
添加了正确的名称,让 __declspec(dllexport)
工作,然后可以解决错误并构建成功。
参考:How can I get rid of the __imp__ prefix in the linker in VC++?