2016-12-17 19 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/what-is-an-undefined-reference-unresolved-external-symbol-error-and-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_;