2012-01-12 85 views
2

我想在C++/CLI中做一些非常简单的事情,但是我遇到了与Visual Studio的问题,我找不出原因。奇怪的C++/CLI链接问题 - 无法解析的外部符号,但头文件链接

我有两个项目,其中一个包含名为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)" ([email protected]@[email protected]) referenced in function "int __clrcall main(cli::array<class System::String^>^)" ([email protected]@[email protected]@@@Z) C:\zcarter\UDK\WebSvcClients\JNITester\JNITester.obj JNITester 
Error 1 error LNK2028: unresolved token (0A000009) "public: __thiscall JNIUtils::JNIUtils(void)" ([email protected]@[email protected]) referenced in function "int __clrcall main(cli::array<class System::String^>^)" ([email protected]@[email protected]@@@Z) C:\zcarter\UDK\WebSvcClients\JNITester\JNITester.obj JNITester 

谁能告诉我我在做什么错吗?

+1

通常您需要使用包含其他对象文件的对象文件或库。 – 2012-01-12 03:38:39

+0

您能告诉我在何处添加obj文件吗?没有lib文件... – 2012-01-12 03:43:20

+0

你能指定你使用的是什么版本的Visual Studio吗? – Coincoin 2012-01-12 03:48:34

回答

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而是因为你使用不会在另一台计算机上运行的方法,除非他们与你做相同的配置。

+0

非常感谢Coincoin,这正是我需要做的。 – 2012-01-12 11:06:46

1

您问题的关键在于您试图在中使用此对象的另一个项目

要做到这一点,您必须将类编译成类库(我建议在此处使用一个静态类),然后将此库链接到第二个程序的编译器设置中。这实际上有些枯燥乏味,但是很好的尝试!

请注意,这里有两个单独的“链接”。一个在你的代码中,你包含头文件;和链接器中的一个(在编译器后发生),链接目标文件(现在位于静态库文件内)。

+0

第一个“链接”根本就没有链接。它只是一个include(它告诉编译器存在'JNIUtils :: JNIUtils')。 – cHao 2012-01-12 03:52:58

+0

有道理,谢谢你davogotland。 – 2012-01-12 11:07:30

相关问题