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
以下是一个基于ITK和QT的项目的例子,该项目用来开发一个三维图像处理的小工具,源文件分成了几个子文件夹,例如view2D, controller等。为了防止在单个Cmakelist.txt中出现过多的内容,使用了subdirectory的方式。其原理是将view2D与controller文件夹下的内容分别编译成库文件,然后再与项目中的可执行文件进行连接。
项目文件夹下的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
- Cmake的使用例子
- [CMake] CMake的使用
- CMake的简单例子
- 一个Cmake的例子
- Cmake的一个例子
- CMake的简单例子
- cmake语法及简单的cmake例子
- 使用CMake编译QT程序的一个例子(没有使用Qt特殊class)
- cmake 的使用
- CMAKE的使用
- CMAKE的使用
- CMake的使用
- CMake的简单使用
- 学习cmake的使用
- CMAKE的使用
- CMAKE的使用
- CMake的使用
- CMAKE的使用
- 【分享】斬魔大聖デモンベイン 無垢なる刃 【日文硬盘版+英文硬盘版】[带全CG存档+攻略]
- 关于VB6弹出菜单的问题
- sdgdfghdf54654657
- java中如何中断thread
- 读Socket流时产生阻塞的解决方案
- Cmake的使用例子
- 程序的核心是什么
- OC的KVC和KVO机制
- copy(浅拷贝) mutableCopy(深拷贝)
- iOS 通讯录访问(代码块的)
- ios响应者链条
- 僵尸移动效果
- Formal System-范式(Normalformen)
- merge interval leetcode java