CMake的使用练习


cmake是一个跨平台的开源的编译工具,它能够生成make文件,然后通过make命令编译C++,当然,其他make支持的语言也可以编译。此处不详述了。这里有一个cmake实践的博客,根据该文档可以一步步的熟悉cmake的用法,链接  。

通过自己建一个工程来学习cmake是最好的方式。在linux命令行下,管理一个C++工程是一个很繁琐的事情。cmake的出现,很好的解决了这个问题。

比如,我创建了一个工程,该工程用于实现各种数据结构。目录如下:


├── build 
├── CMakeLists.txt 
├── include 
│  ├── graph 
│  ├── linklist 
│  │  └── linklist.h 
│  ├── queue 
│  └── stack 
├── src 
│  ├── CMakeLists.txt 
│  ├── graph 
│  ├── linklist 
│  │  └── linklist.cpp 
│  ├── queue 
│  └── stack 
├── tests 
│  ├── CMakeLists.txt 
│  └── linklist_test.cpp 
└── unittests 
    ├── CMakeLists.txt 
    ├── gtest-1.6.0 
    └── src 
        ├── CMakeLists.txt 
        └── linklist 
            ├── CMakeLists.txt 
            └── linklist_unittest.cpp 

其中,build目录用于外部编译时用,即在build目录下运行cmake/make命令,生成可执行程序。

CMakeLists.txt是cmake命令使用到的文件。

include文件夹用于存放头文件。

src则是用于存放程序文件。

tests文件夹用于存放自己写的测试程序。

unittests用于存放单元测试程序文件。

gtest是google的单元测试框架,在这里会使用到。

从目录树中可以看到,我实现了一个linklist程序,并写了它的单元测试程序及测试程序。另外,可以看到,有程序的文件夹下都会有CMakeLists.txt文件。

最外层的CMakeLists.txt文件内容如下:

PROJECT(ds) 
#工程名 
 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
#最低版本号 
 
INCLUDE_DIRECTORIES( 
    ${PROJECT_SOURCE_DIR}/include 
    ${PROJECT_SOURCE_DIR}/include/linklist 
     
    /usr/local/include 
    /usr/include 

#头文件目录 
 
LINK_DIRECTORIES( 
    ${PROJECT_SOURCE_DIR}/lib 
 
    /usr/local/lib 
    /usr/lib 

#链接库目录 
 
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 
#生成的可执行文件所在目录,PROJECT_BINARY_DIR即为外部编译目录,这里即为Build目录 
 
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 
#生成的库文件所在目录 
 
ADD_SUBDIRECTORY(src) 
ADD_SUBDIRECTORY(tests) 
ADD_SUBDIRECTORY(unittests) 
#添加三个要编译的子文件夹 

src下的CMakeLists.txt文件内容如下:

PROJECT(ds) 
SET(DS_SRCS 
    linklist/linklist.cpp 

#将文件名赋值给变量DS_SRCS 
 
ADD_LIBRARY(ds SHARED ${DS_SRCS}) 
ADD_LIBRARY(ds_static STATIC ${DS_SRCS}) 
#将DS_SRCS变量所代表的文件编译为共享库和静态库 
 
SET_TARGET_PROPERTIES(ds_static PROPERTIES OUTPUT_NAME "ds") 
#将静态库的名字输出为ds,这样就和共享库同名了, 
#虽然它们的后缀名不一样,但是仍会冲突。 
 
SET_TARGET_PROPERTIES(ds PROPERTIES CLEAN_DIRECT_OUTPUT 1) 
SET_TARGET_PROPERTIES(ds_static PROPERTIES CLEAN_DIRECT_OUTPUT 1) 
#设置这两个东西可以去除因生成库名称一样而导致的冲突 

unittests目录下的CMakeLists.txt文件内容如下:

PROJECT(ds) 
ADD_SUBDIRECTORY(gtest-1.6.0) 
#添加gtest子目录 
 
SET(GTEST_ROOT ${PROJECT_SOURCE_DIR}/gtest-1.6.0) 
#将gtest目录赋值给变量GTEST_ROOT变量 
 
INCLUDE_DIRECTORIES( 
    ${PROJECT_SOURCE_DIR} 
    ${GTEST_ROOT}/include 

#头文件目录 
 
ADD_SUBDIRECTORY(src) 
#添加src子目录 

  • 1
  • 2
  • 3
  • 下一页

相关内容