2016-12-17 23 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ライブラリで同じことを行うと、ライブラリは正常に構築されます。ここ

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からセグメントである:ここ

#pragma once 
#include <pcl/visualization/pcl_visualizer.h> 

class PCLTester 
{ 
public: 
    PCLTester(); 
    virtual ~PCLTester(); 
}; 

はpcl_visualizer.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); 
} 

任意のアイデア理由で構造及びメンバ関数の競合管理された環境?

私の質問がユニークな理由は、私のシンボルの誤りが私がやったことの結果ではなかったということです。それを定義せずに関数を宣言したり、関数が正しく定義されていないという構文エラーがあったり、リンカー - >入力から.lib依存関係を除外したりします。私の場合は、すべての正しい.libファイルがリンクされており、pcl :: visualizationの関数は明確に定義されているようです。奇妙な理由のため、管理されたライブラリのコンパイル時にはまだ見逃されています。依存関係の問題ではないことを確認するために、管理対象の.vcxprojから管理対象外の.vcxprojに依存関係をコピーしました。両方のクラスは、その点で競合を避けるために最低限のクラス要件でセットアップされています。両方のプロジェクトには、同じ.hファイルと.libファイルがリンクされています。

+0

可能な重複は何未定義の参照/未解決の外部シンボルエラーがあると私はそれをどのように修正するのですか? ](http://stackoverflow.co m/questions/12573816 /未定義 - 参照 - 未解決 - 外部記号エラーと方法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_; 
関連する問題