Cmake的使用例子

来源:互联网 发布:gdb调试linux内核 编辑:程序博客网 时间:2024/06/05 11:14


以前习惯了在windows下写代码时直接用MSVC新建项目,后来要在Linux下开发,以前写的代码不能直接使用,还要仔细地写makefile,实在是费事费力;再后来又在Mac中使用Xcode,除了对自己编写的代码本身的可移植性有很高的要求外,还会遇到使用QT、VTK、ITK、OpenCV等其他开源库的情况,这时安装好这些库后要在自己的项目文件中使用,包含文件、依赖库的配置也比较费事。

直到尝试了用Cmake来生成项目文件,上面的这些问题才得到很好的解决。CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程),能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。Cmake虽然使项目的创建和管理变得简单,然而熟练地掌握其用法也非易事。快速入门的方法可以参见:http://sewm.pku.edu.cn/src/paradise/reference/CMake%20Practice.pdf

以下是一个基于ITKQT目的例子,该项目用来开发一个三维图像处理的小工具,源文件分成了几个子文件,例如view2D, controller等。了防止在Cmakelist.txt中出现过多的内容,使用了subdirectory的方式。其原理是view2Dcontroller文件夹下的内容分别编译成库文件,然后再与项目中的可执行文件进行连接。

项目文件夹下的CMakeList.txt的内容为:

# 版本要求cmake_minimum_required(VERSION 2.8)# 项目名称PROJECT(SegTool)# 使用QTfind_package ( Qt4 COMPONENTS QtGui QtOpenGL REQUIRED )set (QT_USE_QTOPENGL TRUE)INCLUDE(${QT_USE_FILE})message("Libs: ${QT_LIBRARIES}")add_definitions(${QT_DEFINITIONS})include_directories( ${QT_QTOPENGL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} )# 使用了QT的头文件,这些文件要先生成相应的moc_*.cxx才能使用QT中的信号和槽的机制。set (FOO_MOC_HEADERS main/mainwindow.h)# 所有的.h文件set (HEADER_FILES main/mainwindow.h main/GlobalDefinition.h)# 所有的.cpp文件set (SOURCES_FILES main/main.cpp main/mainwindow.cpp main/GlobalDefinition.cpp${HEADER_FILES})# QT的处理,将*.ui界面文件转换成相应的ui_*.h文件,由使用了QT特性的头文件生成moc_*.cxx文件。QT4_WRAP_UI(UISrcs main/mainwindow.ui)QT4_WRAP_CPP(MOCSrcs ${FOO_MOC_HEADERS})#使用ITKfind_package(ITK REQUIRED)include(${ITK_USE_FILE})if (ITKVtkGlue_LOADED)  find_package(VTK REQUIRED)  include(${VTK_USE_FILE})else()  find_package(ItkVtkGlue REQUIRED)  include(${ItkVtkGlue_USE_FILE})  set(Glue ItkVtkGlue)endif()# 添加子文件夹,每一个文件夹下面分别包含一个CMakeList.txt,各生成一个库文件add_subdirectory(model)add_subdirectory(view2d)add_subdirectory(view3d)add_subdirectory(interaction)add_subdirectory(controller)add_subdirectory(algorithm)include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})# 生成可执行文件ADD_EXECUTABLE(SegTool ${SOURCES_FILES} ${MOCSrcs} ${UISrcs})# 连接所需要的库TARGET_LINK_LIBRARIES(SegTool ${QT_LIBRARIES} ${Glue}  ${VTK_LIBRARIES} ${ITK_LIBRARIES} model view2d view3d interaction controller algorithm)

子文件下,以view2D例,CMakeList.txt的内容

# 得到所有的头文件和源文件FILE(GLOB VIEW2D_MOC_HEADERS *.h)FILE(GLOB VIEW2D_SOURCES_FILES *.cpp *.h)# 生成moc_*.cxx文件QT4_WRAP_CPP(VIEW2D_MOCSrcs ${VIEW2D_MOC_HEADERS})include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})# 生成库文件ADD_LIBRARY(view2d ${VIEW2D_MOCSrcs} ${VIEW2D_SOURCES_FILES} ../GLSL/GLSLShader.cpp)# 对源文件进行分组,方便在IDE中查看和管理source_group(ImageWidget\\Headers FILES gl2dwidget.h                    TextureLoadingWidget.haxialglwidget.h  sagittalglwidget.hcoronalglwidget.h  CentralWidget.h                    view2dwidget.h                    viewassemblewidget.h)source_group(ImageWidget\\Sources FILES gl2dwidget.cpp                    TextureLoadingWidget.cppaxialglwidget.cppsagittalglwidget.cppcoronalglwidget.cppCentralWidget.cpp                    view2dwidget.cppviewassemblewidget.cpp)source_group(PanelWidget\\Headers FILES gcpanelwidget.h                    ThresholdSegPanelWidget.hSettingPanelWidget.hPanelWidget.h )source_group(PanelWidget\\Sources FILES gcpanelwidget.cpp                    ThresholdSegPanelWidget.cppSettingPanelWidget.cppPanelWidget.cpp  )

Enjoy!


0 0