組內的項目要從MFC+OpenGL向Qt+VTK遷移。最近的任務是先把一個小模塊進行嘗試性遷移。
配置環境過程中發現Qt+VTK的項目配置起來十分麻煩,於是google之,發現使用CMake這個工具可以大大簡化我們的配置過程。可惜我從沒接觸過Cmake,於是再次google之,發現搜索到的相關教程都很是簡陋,不繫統也不實用。後來在機緣巧合之下找到了一份《Cmake 實踐》(http://sewm.pku.edu.cn/src/paradise/reference/CMake%20Practice.pdf),真是一本很好的快速入門教程,在此感謝作者。
花幾分鐘快速過一下,基本就可以動手了。結合網上的代碼片段,我終於寫出了自己的第一個Cmake腳本——可以把Qt和VTK結合起來,同時也展示瞭如何使用Cmake引入第三方庫。腳本貼在這裏供大家參考:
# This script help you to generate a project which combines VTK and Qt
# Author: Wei Wang
# Date: 2012/2/18
cmake_minimum_required(VERSION 2.8)
PROJECT(LayoutProto)
FIND_PACKAGE(VTK)
INCLUDE(${VTK_USE_FILE}) # include UseVTK.cmake
FIND_PACKAGE(Qt4 REQUIRED)
INCLUDE(${QT_USE_FILE}) # include UseQt4.cmake
# support for out-of-source build
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_BINARY_DIR} #this is where ui_SimpleViewUI.h is generated
${CMAKE_CURRENT_SOURCE_DIR}
)
# Set your files and resources here
# 1. Set path for each kind of files
SET(SourceFilesPath ${PROJECT_SOURCE_DIR}/src)
SET(UIFilesPath ${PROJECT_SOURCE_DIR}/ui)
SET(HeadersFilesPath ${PROJECT_SOURCE_DIR}/inc)
# 2. Add items into current project
SET(SourceFiles main.cpp mainwindow.cpp AutoNDE2DPanel.cpp rawdatapanel.cpp)
SET(UIFiles mainwindow.ui)
SET(HeadersFiles mainwindow.h AutoNDE2DPanel.h rawdatapanel.h)
# 3. Concatenate items and their paths
FOREACH(SrcFile ${SourceFiles})
SET(SimpleViewSrcs ${SimpleViewSrcs} ${SourceFilesPath}/${SrcFile})
ENDFOREACH(SrcFile)
#MESSAGE(STATUS "Files: " ${SimpleViewSrcs})
FOREACH(UIFile ${UIFiles})
SET(SimpleViewUI ${SimpleViewUI} ${UIFilesPath}/${UIFile})
ENDFOREACH(UIFile)
#MESSAGE(STATUS "UIFlie: " ${SimpleViewUI})
FOREACH(HeaderFile ${HeadersFiles})
SET(SimpleViewHeaders ${SimpleViewHeaders} ${HeadersFilesPath}/${HeaderFile})
ENDFOREACH(HeaderFile)
#MESSAGE(STATUS "Headers: " ${SimpleViewHeaders})
# Wrap items to pass them to qmake
QT4_WRAP_UI(UISrcs ${SimpleViewUI})
QT4_WRAP_CPP(MOCSrcs ${SimpleViewHeaders} )
SOURCE_GROUP("Resources" FILES
${SimpleViewUI}
)
SOURCE_GROUP("Generated" FILES
${UISrcs}
${MOCSrcs}
)
# Construct an executable
ADD_EXECUTABLE( LayoutProto ${SimpleViewSrcs} ${UISrcs} ${MOCSrcs})
# Link VTK libs and Qt libs to the executable
TARGET_LINK_LIBRARIES( LayoutProto QVTK )
# Add some 3rd party libs
SET(RDTiffUtilLibPath_Release ${PROJECT_SOURCE_DIR}/lib/release)
SET(RDTiffUtilLibPath_Debug ${PROJECT_SOURCE_DIR}/lib/debug)
SET(RDTiffUtilLib_Release recutil.lib rdtutil.lib rdtiff.lib)
SET(RDTiffUtilLib_Debug recutil.lib rdtutil.lib rdtiff.lib)
# For release mode
FOREACH(LibName ${RDTiffUtilLib_Release})
TARGET_LINK_LIBRARIES( LayoutProto optimized ${RDTiffUtilLibPath_Release}/${LibName})
ENDFOREACH(LibName)
# For debug mode
FOREACH(LibName ${RDTiffUtilLib_Debug})
TARGET_LINK_LIBRARIES( LayoutProto debug ${RDTiffUtilLibPath_Debug}/${LibName})
ENDFOREACH(LibName)
我在Cmake方面也還是菜鳥,以上代碼僅僅是達到能用的地步而已,缺點肯定是很多了,請各位高手多多指點!