pcl_visualizer.h - 致命错误 LNK1120:1 个未解决的外部问题
pcl_visualizer.h - fatal error LNK1120: 1 unresolved externals
error LNK2001: unresolved external symbol "public: virtual void __cdecl pcl::visualization::PCLVisualizer::FPSCallback::Execute(class vtkObject *,unsigned long,void *)" (?Execute@FPSCallback@PCLVisualizer@visualization@pcl@@UEAAXPEAVvtkObject@@KPEAX@Z)
1>C:\Users\hatea\Documents\Visual Studio 2015\Projects\PCLTester\x64\Debug\PCLTester.dll : fatal error LNK1120: 1 unresolved externals
我已经用尽所有方法来解决这个问题。我查了一下这里,发现了一个类似的question/answer系列:error LNK2001 when including "pcl_visualizer.h"
问题是我不想注释掉 FPSCallback 方法。我正在使用的 VTK 可视化工具需要它。我已经确定,当我在托管 C++/CLI 库中引用 .h 文件时,我只会收到未解决的外部错误。
#pragma once
#pragma unmanaged
#include <pcl/visualization/pcl_visualizer.h>
#pragma managed
using namespace System;
namespace PCLTesterCLI
{
public ref class PCLTesterCLI
{
public:
PCLTesterCLI();
virtual ~PCLTesterCLI();
};
}
如果我在非托管 Win32 库中执行相同操作,则库已成功构建。
#pragma once
#include <pcl/visualization/pcl_visualizer.h>
class PCLTester
{
public:
PCLTester();
virtual ~PCLTester();
};
这是来自 pcl_visualizer.h 的片段:
struct FPSCallback : public vtkCommand
{
static FPSCallback *New () { return (new FPSCallback); }
FPSCallback () : actor (), pcl_visualizer (), decimated () {}
FPSCallback (const FPSCallback& src) : vtkCommand (), actor (src.actor), pcl_visualizer (src.pcl_visualizer), decimated (src.decimated) {}
FPSCallback& operator = (const FPSCallback& src) { actor = src.actor; pcl_visualizer = src.pcl_visualizer; decimated = src.decimated; return (*this); }
virtual void
Execute (vtkObject*, unsigned long event_id, void*);
vtkTextActor *actor;
PCLVisualizer* pcl_visualizer;
bool decimated;
};
/** \brief The FPSCallback object for the current visualizer. */
vtkSmartPointer<FPSCallback> update_fps_;
这是来自 pcl_visualizer.cpp 的片段:
void
pcl::visualization::PCLVisualizer::FPSCallback::Execute (
vtkObject* caller, unsigned long, void*)
{
vtkRenderer *ren = reinterpret_cast<vtkRenderer *> (caller);
float fps = 1.0f / static_cast<float> (ren->GetLastRenderTimeInSeconds ());
char buf[128];
sprintf (buf, "%.1f FPS", fps);
actor->SetInput (buf);
}
知道为什么托管环境中的结构和成员函数会发生冲突吗?
我的问题之所以独特,是因为我的符号错误不是我做的任何事情造成的:例如声明一个函数而不定义它,有一个语法错误导致函数没有被正确定义,或者从 Linker->Input 中遗漏了一个 .lib 依赖项。就我而言,我链接了所有正确的 .lib 文件,pcl::visualization 中的函数似乎定义明确。出于某种奇怪的原因,在编译时托管库中仍然遗漏了它。我将我的依赖项从我的托管 .vcxproj 复制到我的非托管 .vcxproj 以验证它不是依赖项问题。两个 classes 都设置了最低 class 要求,以防止这方面的冲突。这两个项目都具有相同的 .h 文件和链接的 .lib 文件。
有趣的是,我通过将 pcl_visualizer 代码放入顶部的托管 C++ 代码中解决了这个问题。我还必须添加一个 header:
#include <vtkTextActor.h>
void
pcl::visualization::PCLVisualizer::FPSCallback::Execute(vtkObject* caller, unsigned long, void*)
{
vtkRenderer *ren = reinterpret_cast<vtkRenderer *> (caller);
float fps = 1.0f / static_cast<float> (ren->GetLastRenderTimeInSeconds());
char buf[128];
sprintf(buf, "%.1f FPS", fps);
actor->SetInput(buf);
}
另一种选择是进入 pcl_visualizer.h 并注释掉有问题的行(我不知道为什么这一行会导致问题,但我将范围缩小到这一点,我的 vtk 可视化工具仍然有效!) :
//FPSCallback (const FPSCallback& src) : vtkCommand (), actor (src.actor), pcl_visualizer (src.pcl_visualizer), decimated (src.decimated) {}
代码如下所示:
struct FPSCallback : public vtkCommand
{
static FPSCallback *New () { return (new FPSCallback); }
FPSCallback () : actor (), pcl_visualizer (), decimated () {}
//FPSCallback (const FPSCallback& src) : vtkCommand (), actor (src.actor), pcl_visualizer (src.pcl_visualizer), decimated (src.decimated) {}
FPSCallback& operator = (const FPSCallback& src) { actor = src.actor; pcl_visualizer = src.pcl_visualizer; decimated = src.decimated; return (*this); }
virtual void
Execute (vtkObject*, unsigned long event_id, void*);
vtkTextActor *actor;
PCLVisualizer* pcl_visualizer;
bool decimated;
};
/** \brief The FPSCallback object for the current visualizer. */
vtkSmartPointer<FPSCallback> update_fps_;
error LNK2001: unresolved external symbol "public: virtual void __cdecl pcl::visualization::PCLVisualizer::FPSCallback::Execute(class vtkObject *,unsigned long,void *)" (?Execute@FPSCallback@PCLVisualizer@visualization@pcl@@UEAAXPEAVvtkObject@@KPEAX@Z)
1>C:\Users\hatea\Documents\Visual Studio 2015\Projects\PCLTester\x64\Debug\PCLTester.dll : fatal error LNK1120: 1 unresolved externals
我已经用尽所有方法来解决这个问题。我查了一下这里,发现了一个类似的question/answer系列:error LNK2001 when including "pcl_visualizer.h"
问题是我不想注释掉 FPSCallback 方法。我正在使用的 VTK 可视化工具需要它。我已经确定,当我在托管 C++/CLI 库中引用 .h 文件时,我只会收到未解决的外部错误。
#pragma once
#pragma unmanaged
#include <pcl/visualization/pcl_visualizer.h>
#pragma managed
using namespace System;
namespace PCLTesterCLI
{
public ref class PCLTesterCLI
{
public:
PCLTesterCLI();
virtual ~PCLTesterCLI();
};
}
如果我在非托管 Win32 库中执行相同操作,则库已成功构建。
#pragma once
#include <pcl/visualization/pcl_visualizer.h>
class PCLTester
{
public:
PCLTester();
virtual ~PCLTester();
};
这是来自 pcl_visualizer.h 的片段:
struct FPSCallback : public vtkCommand
{
static FPSCallback *New () { return (new FPSCallback); }
FPSCallback () : actor (), pcl_visualizer (), decimated () {}
FPSCallback (const FPSCallback& src) : vtkCommand (), actor (src.actor), pcl_visualizer (src.pcl_visualizer), decimated (src.decimated) {}
FPSCallback& operator = (const FPSCallback& src) { actor = src.actor; pcl_visualizer = src.pcl_visualizer; decimated = src.decimated; return (*this); }
virtual void
Execute (vtkObject*, unsigned long event_id, void*);
vtkTextActor *actor;
PCLVisualizer* pcl_visualizer;
bool decimated;
};
/** \brief The FPSCallback object for the current visualizer. */
vtkSmartPointer<FPSCallback> update_fps_;
这是来自 pcl_visualizer.cpp 的片段:
void
pcl::visualization::PCLVisualizer::FPSCallback::Execute (
vtkObject* caller, unsigned long, void*)
{
vtkRenderer *ren = reinterpret_cast<vtkRenderer *> (caller);
float fps = 1.0f / static_cast<float> (ren->GetLastRenderTimeInSeconds ());
char buf[128];
sprintf (buf, "%.1f FPS", fps);
actor->SetInput (buf);
}
知道为什么托管环境中的结构和成员函数会发生冲突吗?
我的问题之所以独特,是因为我的符号错误不是我做的任何事情造成的:例如声明一个函数而不定义它,有一个语法错误导致函数没有被正确定义,或者从 Linker->Input 中遗漏了一个 .lib 依赖项。就我而言,我链接了所有正确的 .lib 文件,pcl::visualization 中的函数似乎定义明确。出于某种奇怪的原因,在编译时托管库中仍然遗漏了它。我将我的依赖项从我的托管 .vcxproj 复制到我的非托管 .vcxproj 以验证它不是依赖项问题。两个 classes 都设置了最低 class 要求,以防止这方面的冲突。这两个项目都具有相同的 .h 文件和链接的 .lib 文件。
有趣的是,我通过将 pcl_visualizer 代码放入顶部的托管 C++ 代码中解决了这个问题。我还必须添加一个 header:
#include <vtkTextActor.h>
void
pcl::visualization::PCLVisualizer::FPSCallback::Execute(vtkObject* caller, unsigned long, void*)
{
vtkRenderer *ren = reinterpret_cast<vtkRenderer *> (caller);
float fps = 1.0f / static_cast<float> (ren->GetLastRenderTimeInSeconds());
char buf[128];
sprintf(buf, "%.1f FPS", fps);
actor->SetInput(buf);
}
另一种选择是进入 pcl_visualizer.h 并注释掉有问题的行(我不知道为什么这一行会导致问题,但我将范围缩小到这一点,我的 vtk 可视化工具仍然有效!) :
//FPSCallback (const FPSCallback& src) : vtkCommand (), actor (src.actor), pcl_visualizer (src.pcl_visualizer), decimated (src.decimated) {}
代码如下所示:
struct FPSCallback : public vtkCommand
{
static FPSCallback *New () { return (new FPSCallback); }
FPSCallback () : actor (), pcl_visualizer (), decimated () {}
//FPSCallback (const FPSCallback& src) : vtkCommand (), actor (src.actor), pcl_visualizer (src.pcl_visualizer), decimated (src.decimated) {}
FPSCallback& operator = (const FPSCallback& src) { actor = src.actor; pcl_visualizer = src.pcl_visualizer; decimated = src.decimated; return (*this); }
virtual void
Execute (vtkObject*, unsigned long event_id, void*);
vtkTextActor *actor;
PCLVisualizer* pcl_visualizer;
bool decimated;
};
/** \brief The FPSCallback object for the current visualizer. */
vtkSmartPointer<FPSCallback> update_fps_;