cmake 学习笔记

转载自大神的学习笔记

假定有vegagis工程,工程的目录结构如下:

–vegagis

|–src 源文件目录

|–gui 界面工程,输出类型:dll,依赖于QT的QtCore、QtGui、QtXml

|–pending 工程中的源文件,不希望加入到工程中

## 为了实现跨平台运行,win32和linux目录下实现的是同一套接口,win32不编译linux目录,linux下则不编译win32目录,但是工程中包含这两个目录

|–win32 win32下的实现

|–linux linux下的实现

|–app 应用程序,输出类型:exe,它依赖于gui

|–include 安装时头文件输出的目录

|–gui

|–app

|–bin 输出路径,存放dll和exe

|–Debug

|–plugins

|–build CMake的build路径,存放生成的工程文件等

vegagis目录下的CMakeLists.txt

///

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

工程名

PROJECT(vegagis)

工程文件中使用相对路径

SET(CMAKE_SUPPRESS_REGENERATION 1)
SET(CMAKE_USE_RELATIVE_PATHS ON)

支持IF(A) ELSE()的写法

SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

定义工程的顶级路径

SET(PROJDIR ${CMAKE_CURRENT_SOURCE_DIR})

定义源文件目录

SET(SRCDIR ${PROJDIR}/src)

设置输出路径

SET(EXECUTABLE_OUTPUT_PATH PROJECTBINARYDIR/bin)SET(LIBRARYOUTPUTPATH {PROJECT_BINARY_DIR}/bin)

设置安装路径

SET(CMAKE_INSTALL_PREFIX ${PROJDIR}/bin)

定义头文件安装目录

SET(VGIS_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/headers)

根据操作系统不同而设置不同的路径

IF(WIN32)
SET(GDAL_HDRS “E:/lib/gdal/include”)
ELSE()
SET(GDAL_HDRS “/home/sunsc/gdal/”)
ENDIF()

设置头文件的引用路径

INCLUDE_DIRECTORIES(
${GDAL_HDRS}
)

设置引用库路径

SET(LIBS LIBRARYOUTPUTPATH)LINKDIRECTORIES( {LIBS})

设置依赖库Qt4

SET(QT_MIN_VERSION 4.5.2)
FIND_PACKAGE(Qt4 QTMINVERSIONCOMPONENTSQtCoreQtGuiQtXmlREQUIRED)INCLUDE( {QT_USE_FILE})

宏,实现visio studio的目录分组(过滤器)功能

macro(source_group_by_dir source_files)
if(MSVC)
set(sgbd_cur_dir CMAKECURRENTSOURCEDIR)foreach(sgbdfile {{source_files}})  
            string(REGEX REPLACE
{sgbd_cur_dir}//(.*/) //1 sgbd_fpath ${sgbd_file})
string(REGEX REPLACE “/(./)/.” //1 sgbd_group_name sgbdfpath)string(COMPAREEQUAL {sgbd_fpath} sgbdgroupnamesgbdnogroup)string(REPLACE///sgbdgroupname {sgbd_group_name})
if(sgbd_nogroup)
set(sgbd_group_name “//”)
endif(sgbd_nogroup)
source_group( sgbdgroupnameFILES {sgbd_file})
endforeach(sgbd_file)
endif(MSVC)
endmacro(source_group_by_dir)

添加子目录

ADD_SUBDIRECTORY(src)

vegagis/src目录下的CMakeLists.txt

///

ADD_SUBDIRECTORY(gui)
ADD_SUBDIRECTORY(app)

添加依赖关系

ADD_DEPENDENCIES(APP GUI)

vegagis/src/gui目录下的CMakeLists.txt

///

SET(TARGET_NAME GUI)

预定义宏,-D选项

ADD_DEFINITIONS(-DVMAP_GUI_LIB)

ui文件

SET(GUI_UIS vmapmainwindow.ui)

源文件类型为.h.c

FILE(GLOB_RECURSE GUI_SRCS CMAKECURRENTSOURCEDIR/.c {CMAKE_CURRENT_SOURCE_DIR}/.h)

FILE目前还不支持类似EXCLUDE的特性,所以Pending中的文件在上一语句中叶包括了,我们删除它

FILE(GLOB PENDING CMAKECURRENTSOURCEDIR/pending/)LIST(REMOVEITEMGUISRCS {PENDING}) #新生成的GUI_SRCS就不包括pending目录的源文件了

参与QT MOC的头文件

FILE(GLOB_RECURSE GUI_MOC_HDRS vmapview.h transformlistener.hpp)

设置资源qrc文件

SET (GUI_RCCS ui.qrc)

QT4_WRAP_UI(GUI_UIS_H GUIUIS)QT4WRAPCPP(GUIMOCSRCS {GUI_MOC_HDRS})
QT4_ADD_RESOURCES(GUI_RCC_SRCS ${GUI_RCCS})

由于.ui文件输出路径是在build目录下,所以需要添加${CMAKE_CURRENT_BINARY_DIR}目录

INCLUDE_DIRECTORIES( SRCDIR/gui {CMAKE_CURRENT_BINARY_DIR})

设置需要加入到工程中,但是不需要编译的源文件

IF (WIN32)
FILE(GLOB_RECURSE PLATFORM_SRC “ CMAKECURRENTSOURCEDIR/linux/)ELSE()FILE(GLOBRECURSEPLATFORMSRC {CMAKE_CURRENT_SOURCE_DIR}/win32/*”)
ENDIF()
FILE(GLOB_RECURSE EXCLUDE_SRC PLATFORMSRC)SETSOURCEFILESPROPERTIES( {EXCLUDE_SRC} PROPERTIES HEADER_FILE_ONLY true) #设置源文件属性为不参与编译

进行源代码分组

source_group_by_dir(GUI_SRCS)

动态链接库

ADD_LIBRARY( TARGETNAMESHARED {GUI_SRCS} GUIUISH {GUI_RCC_SRCS} ${GUI_MOC_SRCS})

TARGET_LINK_LIBRARIES( TARGETNAME {QT_LIBRARIES})

//

vegagis/src/app下的CMakeLists.txt

//

SET(TARGET_NAME APP)

SET(APP_UIS vmapmainwindow.ui)

FILE(GLOB_RECURSE APP_SRCS CMAKECURRENTSOURCEDIR/.c {CMAKE_CURRENT_SOURCE_DIR}/.h)

SET (APP_MOC_HDRS vmapmainwindow.h)

SET (APP_RCCS vmapmainwindow.qrc)

QT4_WRAP_UI(APP_UIS_H APPUIS)QT4WRAPCPP(APPMOCSRCS {APP_MOC_HDRS})
QT4_ADD_RESOURCES(APP_RCC_SRCS ${APP_RCCS})

添加头文件

INCLUDE_DIRECTORIES( CMAKECURRENTBINARYDIR {SRCDIR}/apps/qt/${TARGET_NAME})

源文件分组

source_group_by_dir(APP_SRCS)

exe应用程序

ADD_EXECUTABLE( TARGETNAME {APP_SRCS} APPRCCSRCS {APP_UIS_H} ${APP_MOC_SRCS})

TARGET_LINK_LIBRARIES语句必须放到ADD_EXECUTABLE语句之后,否则引起链接错误

TARGET_LINK_LIBRARIES( TARGETNAME {QT_LIBRARIES} GUI)

其他

1、输出路径的问题

如果要修改输出路径,通常采用SET(LIBRARY_OUTPUT_PATH XXX)即可,但是在WIN32下,会自动放到 XXX/Debug/ReleasepluginsSET(LIBRARYOUTPUTPATHXXX/plugins) {XXX}/plugins/Debug,这显然不是我们希望的。做法是设置PREFIX,如SET_TARGET_PROPERTIES(abc PROPERTIES PREFIX plugins/)。同理,如果输出路径不管Debug、Release都放置一样,则设置PREFIX为../。

2、头文件安装时按照目录层次存放

FILE(GLOB_RECURSE HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} .h)
FOREACH (HEADER HEADERS)STRING(REGEXMATCH(.)[///]DIR {HEADER})
INSTALL(FILES HEADERDESTINATION {VGIS_INCLUDE_DIR}/ DIR)ENDFOREACH(HEADER {HEADERS})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值