CMake在多级目录项目中的简单使用

参考此文做的工程

参考了这篇文章,使用cmake创建的lua的测试环境.
基于cocos2d-x中的tolua和lua库,可以比较方便测试lua相关c的api和绑定逻辑。

git clone https://github.com/richieyan/native_lua.git

引言

在项目比较小的时候,只需要简单地编写Makefile文件就可以完成了对项目的管理。随着项目的规模日益增大,使用一个好的构建工具来管理项目, 变得非常重要。过去一般是使用autoconf, automake那一套来解决,即./configure, make, make install。由于自己对autoconf不是很懂也不感冒,所以没有怎么去用它。最近在看到了CMake,这是一个夸平台的项目构建工具,很简单,夸 平台,对我来说,能够简单地上手并且解决所需要的需求。所以写下这个CMake简单使用的博客,记录下来方便将来查阅。
项目简介
首先给出项目的一个布局(layout)吧。

->projects/ttiger$ tree
.
|-- CMakeLists.txt
|-- build
|-- include
|   `-- ttiger
|       |-- exception
|       |   `-- exception.hpp
|       `-- util
|           `-- test.hpp
|-- src
|   |-- CMakeLists.txt
|   `-- ttiger
|       |-- exception
|       |   `-- exception.cxx
|       `-- util
|           `-- test.cxx
|-- tests
|   |-- CMakeLists.txt
|   `-- mytest.cxx
`-- unittests
    |-- CMakeLists.txt
    `-- ttiger_unittests.cxx

可以看到,在这个项目是一个以ttiger库为主体的项目。
在ttiger库目录中,存在有include和src目录。其分别是记录下该ttiger项目的头文件和源文件。为了便于项目组织,所以我将每 一个功能模块放在一个单独的目录下,用单独的namespace来表示,有点类似于Java的组织方式,如在图中存在有 ttiger::exception::Exception这个类(src/ttiger/exception/exception.cxx)
在tests中存在一些使用了该ttiger库的程序,在上面里面只是写了一个简单的mytest.cxx文件,其使用了ttiger库里面一部 分功能
在unittests中存在的是对ttiger进行单元测试的测试用例。使用了google的test框架 google-test或者gtest
build目录只是用来进行编译生成的,即进行out-of-source building
CMakeLists示例
上面简单地介绍了项目的布局,那么下面就记录下项目中应用到的CMakeList.txt
根目录
因为CMakeLists.txt是嵌套的,下面先介绍最上面的

# the whole CMakeLists.txt for project ttiger
PROJECT(ttiger)

CMAKE_MINIMUM_REQUIRED(VERSION 2.4)

# include directories
INCLUDE_DIRECTORIES(
  ${PROJECT_SOURCE_DIR}/include
  ${PROJECT_SOURCE_DIR}/include/ttiger

  /usr/local/include
  /usr/include
)

# lib directories
LINK_DIRECTORIES(
  ${PROJECT_BINARY_DIR}/lib

  /usr/local/lib
  /use/lib
)

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(tests)
ADD_SUBDIRECTORY(unittests)
SRC目录

下面的是src下面的CMakeLists.txt文件:

# CMakeLists for src directory
PROJECT(ttiger)

SET(TTIGER_SRCS
  ttiger/exception/exception.cxx

  ttiger/util/test.cxx
)

# shared library
ADD_LIBRARY(ttiger SHARED ${TTIGER_SRCS})

# static library
ADD_LIBRARY(ttiger_static STATIC ${TTIGER_SRCS})
SET_TARGET_PROPERTIES(ttiger_static PROPERTIES OUTPUT_NAME "ttiger")
SET_TARGET_PROPERTIES(ttiger PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(ttiger_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)

应用程序目录
下面给出使用了ttiger库的应用程序的CMakeLists.txt文件

# test directory CMakeLists.txt
ADD_EXECUTABLE(mytest mytest.cxx)
TARGET_LINK_LIBRARIES(mytest ttiger)

其就是用ADD_EXECUTABLE来告诉编译啥可执行文件,用TARGET_LINK_LIBRARIES来指定使用了那些库,这样就可以编译 出来mytest可执行文件了
单元测试目录

# CMakeLists.txt for directory unittests
ADD_EXECUTABLE(ttiger_unittests ttiger_unittests.cxx)
TARGET_LINK_LIBRARIES(ttiger_unittests ttiger;gtest;pthread)

具体情况跟应用程序目录一样
应用程序编译与执行
所有的都已经写好了,开始编译吧

$ cd build/
$ cmake ..

[转载] http://blog.csdn.net/mathlmx/article/details/45799017

你可能感兴趣的:(CMake在多级目录项目中的简单使用)