pcl_visualizer.h - 致命错误LNK1120:1个未解析的外部

时间:2016-12-17 00:01:29

标签: point-cloud-library managed-c++ unresolved-external

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

我已经彻底解决了处理这个问题的所有途径。我在这里查了一下,我发现了一个类似的问题/答案系列: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-&gt; Input中省略.lib依赖项。在我的情况下,我已经链接了所有正确的.lib文件,并且pcl :: visualization中的函数似乎已经定义好了。由于某些奇怪的原因,它在托管库中的编译时仍然被遗漏。我将我的托管.vcxproj中的依赖项复制到我的非托管.vcxproj,以验证它不是依赖项问题。这两个类都设置了最低级别要求,以防止这方面的冲突。两个项目都链接了相同的.h文件和.lib文件。

1 个答案:

答案 0 :(得分:0)

有趣的是,我通过将pcl_visualizer代码放在顶部的托管c ++代码中解决了这个问题。我还必须添加一个标题:

mainMenuPanel

另一个选择是进入pcl_visualizer.h并注释掉有问题的行(我不知道为什么这行导致了问题,但我把它缩小到这个,我的vtk可视化工具仍然可以工作!):<​​/ p >

searchPanel

然后代码如下:

#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);
}