奇怪的C ++ / CLI链接问题 - 未解析的外部符号但链接头文件

时间:2012-01-12 03:32:34

标签: .net compilation linker c++-cli

我正在尝试在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

谁能告诉我这里我做错了什么?

3 个答案:

答案 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++?