2016-12-17 76 views
0
error LNK2001: unresolved external symbol "public: virtual void __cdecl pcl::visualization::PCLVisualizer::FPSCallback::Execute(class vtkObject *,unsigned long,void *)" ([email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 
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"pcl_visualizer.h - 致命錯誤LNK1120:1個未解決的外部事件

問題是我不想註釋掉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); 
} 

任何想法,爲什麼在結構和成員函數衝突託管環境?

我的問題是獨特的原因是我的符號錯誤不是我做的任何事情的結果:例如,聲明一個沒有定義它的函數,有一個語法錯誤導致函數沒有被正確定義,或者從鏈接器 - >輸入中遺漏一個.lib依賴。在我的情況下,我已經鏈接了所有正確的.lib文件,並且來自pcl :: visualization的函數看起來很好定義。出於某種奇怪的原因,它在編譯時仍然在託管庫中錯過。我將我的託管.vcxproj中的依賴項複製到我的非託管.vcxproj中,以驗證它不是依賴項問題。這兩個班都設有最低等級要求,以防止這方面的衝突。兩個項目都鏈接相同的.h文件和.lib文件。

+0

的[可能的複製什麼是未定義參考/解析的外部符號錯誤,我該如何解決? ](http://stackoverflow.co m/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix) –

+0

我不確定你指的是哪個答案,這是重複的。到目前爲止,我沒有看到您發佈的關於託管/非託管鏈接錯誤的鏈接中的答案。爲什麼.lib定義在非託管但不受管理的靜態/類庫中工作?我也很好奇,爲什麼我能夠在我的託管C++文件中重新定義函數,而不會遇到任何編譯錯誤(我預料會發生一些阻止.lib定義工作的衝突)。 – Wurth

+0

該帖子有幾十個答案,其中描述了未解決的外部或引用的許多原因。如果你沒有找到解決你問題的方法,那麼你的閱讀不夠。在這裏搜索LNK1120可以找到近3000條結果,在寫這個問題之前,你很少讀過這些結果。 –

回答

0

有趣的是,我通過將pcl_visualizer代碼放置在頂部的託管C++代碼中解決了此問題。我不得不添加頁眉和:

#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_; 
相關問題