IT shoveler

PCL 1.6을 Visual studio 2010, Window 7 64bit에서 설치하기 (LNK2019)

작성일 작성자 최혁두

 

어제부터 PCL을 설치하고나서 벼래별 삽질을 하다 좀 전에 작동하는 것을 확인함.

내가 삽질한 과정은 관심없을 테니 심플하게 설치과정만 설명하겠다.

 

일단 설치는

1. http://pointclouds.org/downloads/

 

2. 화면 가운데 Windows 클릭

 

3.

 

넷 중에 자신에게 맞는것 선택하여 다운받고 설치.

설치 끗

 

나는 MSVC 2010 64bit 를 선택했으므로 이 환경에서의 설정만 설명한다.

이제 간단한 예제프로그램을 만들며 설정방법을 설명한다.

여기 나오는 코드는 http://blog.daum.net/openpcl/36 요기 다른분이 한것을 배꼈다.;;

나도 처음이라 여기저기 알아보고 다녔으니까.

 

1. VS2010을 열어서 콘솔 프로젝트를 하나 만든다.

 

2. main 함수에 이런 코드를 갖다 붙인다. 빌드! 하면 당연히 아무것도 안되겠지?ㅋ;

 

 int main ()
{

 pcl::PointCloud<pcl::PointXYZ> cloud;
 cloud.width    = 10000;
 cloud.height   = 1;
 cloud.is_dense = false;
 cloud.points.resize (cloud.width * cloud.height);

 for (size_t i = 0; i < cloud.points.size (); ++i)
 {
  cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
  cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
  cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
 }
 for (size_t i = 0; i < cloud.points.size (); ++i)
  std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;


 pcl::visualization::CloudViewer viewer("PCL Viewer");
 viewer.showCloud(cloud.makeShared());
 while (!viewer.wasStopped());

 return 0;
}

 

3. 프로젝트 속성에서 포함 디렉토리 추가

C:\Program Files\PCL 1.6.0\include\pcl-1.6;

C:\Program Files\PCL 1.6.0\3rdParty\Boost\include;

C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include;

C:\Program Files\PCL 1.6.0\3rdParty\FLANN\include;

C:\Program Files\PCL 1.6.0\3rdParty\Qhull\include;

C:\Program Files\PCL 1.6.0\3rdParty\VTK\include\vtk-5.8;

 

라이브러리 디렉토리 추가

C:\Program Files\PCL 1.6.0\lib;

C:\Program Files\PCL 1.6.0\3rdParty\Boost\lib;

C:\Program Files\PCL 1.6.0\3rdParty\FLANN\lib;

C:\Program Files\PCL 1.6.0\3rdParty\Qhull\lib;

C:\Program Files\PCL 1.6.0\3rdParty\VTK\lib\vtk-5.8;

 

 

4. stdafx.h 에 라이브러리 및 헤더 추가

 

#pragma comment(lib, "pcl_apps_debug.lib")
#pragma comment(lib, "pcl_common_debug.lib")
#pragma comment(lib, "pcl_features_debug.lib")
#pragma comment(lib, "pcl_filters_debug.lib")
#pragma comment(lib, "pcl_io_debug.lib")
#pragma comment(lib, "pcl_io_ply_debug.lib")
#pragma comment(lib, "pcl_kdtree_debug.lib")
#pragma comment(lib, "pcl_keypoints_debug.lib")
#pragma comment(lib, "pcl_octree_debug.lib")
#pragma comment(lib, "pcl_registration_debug.lib")
#pragma comment(lib, "pcl_sample_consensus_debug.lib")
#pragma comment(lib, "pcl_search_debug.lib")
#pragma comment(lib, "pcl_segmentation_debug.lib")
#pragma comment(lib, "pcl_surface_debug.lib")
#pragma comment(lib, "pcl_tracking_debug.lib")
#pragma comment(lib, "pcl_visualization_debug.lib")

(다 필요한건 아니지만 확인하기 귀찮으니..;;;)

 

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>

 

여기까지하면 뭔가 다 한 것 같다. 이건 나도 어제 다 해봤는데 나는 왜 그런지

LNK2019 ~~~~로 시작하는 어마어마한 에러들이 뜬다;;

 

1>PCLTest.obj : error LNK2019: "public: __thiscall pcl::visualization::CloudViewer::~CloudViewer(void)" (??1CloudViewer@visualization@pcl@@QAE@XZ) 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
1>PCLTest.obj : error LNK2019: "public: bool __thiscall pcl::visualization::CloudViewer::wasStopped(int)" (?wasStopped@CloudViewer@visualization@pcl@@QAE_NH@Z) 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
1>PCLTest.obj : error LNK2019: "public: void __thiscall pcl::visualization::CloudViewer::showCloud(class boost::shared_ptr<class pcl::PointCloud<struct pcl::PointXYZ> const > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?showCloud@CloudViewer@visualization@pcl@@QAEXABV?$shared_ptr@$$CBV?$PointCloud@UPointXYZ@pcl@@@pcl@@@boost@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
1>PCLTest.obj : error LNK2019: "public: __thiscall pcl::visualization::CloudViewer::CloudViewer(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0CloudViewer@visualization@pcl@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
1>D:\Work\PCL\PCLTest_VS10_2012.5.7_4\Debug\PCLTest.exe : fatal error LNK1120: 4개의 확인할 수 없는 외부 참조입니다.

 

여기서부터 나의 고통이 시작되었고 내가 이 글을 쓰고 있는 이유임.

분명 필요한 라이브러리 파일을 추가했는데

#pragma comment(lib, "pcl_visualization_debug.lib") <-- 요렇게

이 안에들어있는 함수가 선언만 됐고 정의가 안 됐다고 감히 땡깡을 부리는 것이다!!

 

왜 그럴까 이틀동안 삽질하다가 생기연 양광웅 수석 연구원님의 블로그를 보고 뭔가를 발견했다.

Win32로 설정된 플랫폼을 x64로 바꾸라나? 이게 뭐야? 했지만 64비트 라이브러리를 깔았으니 64비트 플랫폼을 쓰라는건가? 라고 일단 이해했다.

양수석님은 PCL 1.4 버전에 VS2008인데 똑같을까? 했는데 된다.

 

VS2010에서는 어떻게 하느냐면..

프로젝트 - 속성으로 가서 위쪽의 구성관리자 클릭!

 

 

 

활성 솔루션 플랫폼 아래 Win32 누르면 "새로 만들기"라는 메뉴가 뜬다. 클릭!

새 플랫폼 입력 또는 선택에서 x64 선택해서 설정하면 된다.

그래서 다음과 같은 화면이 보이면 OK!

 

 

 

이제 빌드하고 실행해 보자.

된다아~! ㅠㅠ

코드 내용자체가 무작위로 포인트 클라우드 만들어서 보여주는 것이니 뭐랄까? 시골 밤 하늘 같다.

 

 

 

'h' 키를 누르면 콘솔에 사용법이 뜬다.

 

내가 참고한 TestPCL을 모방한 PCLTest (ㅋ) 프로젝트를 올릴테니 참고하시길

 

 

PCLTest_VS2010.zip

 

 

나는 이제 다시 삽질하러.. ㄱㄱ

 

 

 ---------------------------------------------------------------------------------------

2013.05.19 업데이트


나중에 안 사실이지만 그냥 저런 설정안하고 PCL 1.6.0 32-bit 버전을 설치해도 된다.

즉 운영체제가 64비트 이거나 말거나 PCL 32비트 버전을 설치하고 플랫폼을 Win32로 두고 돌려도 아주 잘 돌아간다.

32비트 설치하면 폴더만 C:\Program Files (x86)\PCL 1.6.0 여기로 바뀐다.

32비트를 써야만 하는 다른 라이브러리를 사용할 때 이렇게 쓰면 된다.





맨위로
통합 검색어 입력폼