본문 바로가기
C++ 200제/코딩 IT 정보

CMake PCL Qt5, CMakeLists 구성 방법과 예제

by vicddory 2017. 6. 28.

CMake PCL Qt5, CMakeLists 구성 방법과 예제


PCL의 3rd party 라이브러리 중 하나인 vtk(visualizer toolkit)은 2016년 현재 Qt 4.8.4까지 지원하고 있다. Qt가 5.6까지 나온 것을 고려하자면 정말 너무할 정도로 호환성이 떨어진다. Qt가 버전 5부터 급격히 변화한 것은 사실이나, 그렇다고 해서 아직도 지원을 미루고 있는 현 상황은 내심 불만이다.


Qt5 부터 지원되는 다양한 라이브러리를 PCL에선 현재 사용할 수가 없다. 만약 각종 뷰어를 안 쓴다면 PCL을 사용할 수 있으나, 뷰어가 필요하다면 Qt의 버전을 4.8.4까지 낮춰야 한다.


이런 결론을 얻을 수 있었던 건, 내가 Qt5를 이용해 각종 삽질을 해봤기 때문이다. 내가 실수한 부분도 있을 수 있다. 그래서 CMakeLists.txt를 공개하고 이 글을 읽는 다른 분들의 의견을 구하고 싶다. 아래는 내가 끝끝내 vtk를 이용해 뷰어를 띄우지 못한 파일이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
cmake_minimum_required (VERSION 2.6 FATAL_ERROR)
 
set(QMAKE_CXXFLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
project      (pcl-visualizer)
 
#find_package (Qt4 REQUIRED)
find_package (VTK REQUIRED)
find_package (PCL 1.7.1 REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Widgets Core Network)
#find_package (Qt5Core)
find_package (Qt5Gui REQUIRED)
#find_package (Qt5Widgets)
#find_package (Qt5Network REQUIRED)
 
get_target_property(Qt5Core_location Qt5::Core LOCATION)
get_target_property(Qt5Network_location Qt5::Network LOCATION)
 
include_directories (${PCL_INCLUDE_DIRS})
include_directories(${Qt5Core_INCLUDE_DIRS})
include_directories(${Qt5Core_LIBRARIES})
include_directories(${Qt5Network_INCLUDE_DIRS} )
include_directories(${Qt5Network_LIBRARIES} )
include_directories(${QT_INCLUDE_DIR})
 
link_directories    (${PCL_LIBRARY_DIRS})
 
add_definitions     (${PCL_DEFINITIONS})
add_definitions("-std=c++11")
 
set  (project_SOURCES main.cpp pclviewer.cpp ethernet.cpp)
set  (project_HEADERS pclviewer.h ethernet.h)
set  (project_FORMS   pclviewer.ui)
set  (VTK_LIBRARIES   vtkRendering vtkGraphics vtkHybrid QVTK)
 
QT5_WRAP_CPP(project_HEADERS_MOC   ${project_HEADERS})
qt5_wrap_ui(project_FORMS_HEADERS ${project_FORMS})
 
#INCLUDE (${QT_USE_FILE})
 
ADD_DEFINITIONS (${QT_DEFINITIONS})
 
ADD_EXECUTABLE  (pcl_visualizer ${project_SOURCES}
                                ${project_FORMS_HEADERS}
                                ${project_HEADERS_MOC})
 
#TARGET_LINK_LIBRARIES (pcl_visualizer ${QT_LIBRARIES} ${PCL_LIBRARIES} ${VTK_LIBRARIES} Qt5::Core Qt5::Network)
TARGET_LINK_LIBRARIES (pcl_visualizer ${PCL_LIBRARIES} ${VTK_LIBRARIES} Qt5::Core Qt5::Network)
 
qt5_use_modules (pcl_visualizer Widgets)
cs


위의 파일은 원래 PCL 공식 홈페이지의 한 예제에서 따왔다.


(링크 - Create a PCL visualizer in Qt with cmake)


주요 기능은 아래와 같다.

pushButton_random:

- if button is pressed call randomButtonPressed ()


horizontalSlider_R:

- if slider value is changed call redSliderValueChanged(int) with the new value as argument

- if slider is released call RGBsliderReleased()


horizontalSlider_G:

- if slider value is changed call redSliderValueChanged(int) with the new value as argument

- if slider is released call RGBsliderReleased()


horizontalSlider_B:

- if slider value is changed call redSliderValueChanged(int) with the new value as argument

- if slider is released call RGBsliderReleased()


위의 링크로 들어가면 QMainWindow를 이용해 vtk를 연동할 수 있는 방법도 알 수 있다. 아래 그림처럼.


pcl_visualizer[CMake PCL Qt5, CMakeLists 구성 방법과 예제]

<예제 결과 화면>


이 예제의 CMakeLists.txt 파일은 Qt4를 이용하도록 구성되어 있다. 그 파일을 내가 수정한 것이다.


나의 경우엔 QTcpSocket을 이용해야 하는데, 이 라이브러리는 Qt 5.0.1부터 추가되어 Qt4에선 사용할 수가 없다. 그래서 어떻게든 Qt5와 호환이 되도록 구성해 보았으나 뜻대로 되진 않았다. 윈도우에선 vtk가 Qt5와 호환이 되도록 지원하고 있는데 리눅스는 아직 지원되질 않는다.


어쨌든 위와 같은 make 파일을 이용하면 빌드는 정상적으로 이뤄진다. 그러나 실제 뷰어가 생성되진 않는다.


QtGui_QWidget_No_such_file_or_directory[CMake PCL Qt5, CMakeLists 구성 방법과 예제]


위와 같은 에러가 발생하며 프로그램은 실행되지 않는다.


현재로선, PCL과 뷰어를 이용하려면 Qt의 버전을 4.8.4로 낮추던지, Qt 자체를 이용하지 않는 방법을 생각해야 한다. 순수 C++로만 소스를 제작하는 것도 좋은 방법이 될 것으로 생각한다.


CMakeLists.txt 파일은 위에도 있지만 복사하기 귀찮은 분들은 아래 파일을 내려받으면 된다.



CMake PCL Qt5, CMakeLists 구성 방법과 예제

댓글