CMake总结


(1)用cmake创建可执行文件

1)单源文件目录

清单 1 源文件 main.cpp

  1. <span style="font-size:18px; color:#006600"> #include<iostream>  
  2.   
  3.  int main()  {  
  4.      std::cout<<"Hello word!"<<std::endl;  
  5.      return 0;  
  6.  }</span>  

CMakeLists.txt文件与main.cpp放在同一目录下

清单 2 CMakeLists.txt  

  1. <span style="font-size:18px; color:#006600">PROJECT(main)  
  2. CMAKE_MINIMUM_REQUIRED(VERSION 2.6)   
  3. AUX_SOURCE_DIRECTORY(. DIR_SRCS)   
  4. ADD_EXECUTABLE(main ${DIR_SRCS})</span>  

CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,符号"#"后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。

例如对于清单2的 CMakeLists.txt 文件:

第一行是一条命令,名称是 PROJECT ,参数是 main ,该命令表示项目的名称是 main 。

第二行的命令限定了 CMake 的版本。

第三行使用命令 AUX_SOURCE_DIRECTORY 将当前目录中的源文件名称赋值给变量 DIR_SRCS 。 CMake 手册中对命令 AUX_SOURCE_DIRECTORY 的描述如下:

aux_source_directory(<dir> <variable>) 

该命令会把参数 <dir> 中所有的源文件名称赋值给参数 <variable> 。

第四行使用命令 ADD_EXECUTABLE 指示变量 DIR_SRCS 中的源文件需要编译成一个名称为 main 的可执行文件。


2)多源文件目录

CMake总结


清单 3 目录 step2 中的 CMakeLists.txt

  1. <span style="font-size:18px; color:#006600">PROJECT(main)  
  2. CMAKE_MINIMUM_REQUIRED(VERSION 2.6)  
  3. ADD_SUBDIRECTORY( src )  
  4. AUX_SOURCE_DIRECTORY(. DIR_SRCS)   
  5. ADD_EXECUTABLE(main ${DIR_SRCS})  
  6. TARGET_LINK_LIBRARIES( main Test )</span>  

相对于清单 2,该文件添加了下面的内容: 第三行,使用命令 ADD_SUBDIRECTORY 指明本项目包含一个子目录 src 。第六行,使用命令 TARGET_LINK_LIBRARIES 指明可执行文件 main 需要连接一个名为Test的链接库 。
 
第二步,子目录中的 CMakeLists.txt
在子目录 src 中创建 CMakeLists.txt。文件内容如下:


清单 4 目录 src 中的 CMakeLists.txt

  1. <span style="font-size:18px; color:#006600">AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS)  
  2.   
  3. ADD_LIBRARY ( Test ${DIR_TEST1_SRCS})  </span>  


在该文件中使用命令 ADD_LIBRARY 将 src 中的源文件编译为库

ADD_SUBDIRECTORY( src ) 时进入目录src 对其中的CMakeLists.txt 进行解析。


3)在工程中查找并使用其他库初步

清单5 Findlibdb_cxx.cmake文件

  1. <span style="font-size:18px; color:#006600">MESSAGE(STATUS"Using bundled Findlibdb.cmake...")  
  2.   
  3. FIND_PATH(  
  4.     LIBDB_CXX_INCLUDE_DIR  
  5.     NAMES  
  6.     PATHS  
  7.     )  
  8. FIND_LIBRARY(  
  9.     LIBDB_CXX_LIBRARIES NAMES  
  10.     PATHS  
  11.     )</span>  

清单6 能调用Finddb_cxx.cmake的CMakeLists.txt文件
  1. <span style="font-size:18px; color:#006600">PROJECT(main)  
  2. CMAKE_MINIMUM_REQUIRED(VERSION 2.6)  
  3. SET(CMAKE_SOURCE_DIR .)  
  4. SET(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules ${CMAKE_SOURCE_DIR}/cmake/modules)  
  5. AUX_SOURCE_DIRECTORY(. DIR_SRCS)  
  6. ADD_EXECUTABLE(main ${DIR_SRCS})  
  7.   
  8. FIND_PACKAGE(libdb_cxx REQUIRED)  
  9. MARK_AS_ADVANCED(  
  10. LIBDB_CXX_INCLUDE_DIR  
  11. LIBDB_CXX_LIBRARIES  
  12. )  
  13.   
  14. IF(LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBBRARIES)  
  15. MESSAGE(STATUS"Found libdb libraries")  
  16. INClUDE_DIRECTORIES(${LIBDB_CXX_INCLUDE_DIR})  
  17. MESSAGE(${LIBDB_CXX_LIBRARIES})  
  18. TARGET_LINK_LIBRARIES(main ${LIBDB_CXX_LIBRARIES})  
  19. ENDIF(LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES)</span>  
其中第4行便是设置调用清单5的指令;第8行时,cmake会到CMAKE_MODULE_PATH中查找并执行清单5的指令

(2)用cmake创建动态库和静态库

新建个t3目录,在t3目录中再建个lib目录,在t3目录中新建个CMakeLists.txt文件,然后在lib中新建CMakeLists.txt,hello.h,hello.cpp三个文件

1)清单1 hello.h

  1. <span style="font-size:18px; color:#006600">//hello.h  
  2. #ifndef HELLO_H  
  3. #define HELLO_H  
  4. #include <stdio.h>  
  5. void HelloFunc();  
  6. #endif</span>  

2)清单2 hello.cpp

  1. <span style="font-size:18px; color:#006600">//hello.c  
  2.   
  3. #include "hello.h"  
  4. void HelloFunc()  
  5. {  
  6.     printf("Hello World\n");  
  7. }</span>  

3)清单3 lib目录下CMakeLists.txt

  1. <span style="font-size:18px; color:#006600">#CMakeLIsts.txt  
  2. SET(LIBHELLO_SRC hello.c)  
  3. ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})  
  4. ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})  
  5. SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")  
  6. SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)</span>  

4)清单4 t3目录下CMakeLists.txt

  1. PROJECT(HELLOLIB)  
  2. ADD_SUBDIRECTORY(lib)  

(3)调用动态库和静态库
1)安装动态库,在lib目录下的CMakeLists.txt 清单1

  1. <span style="font-size:18px; color:#006600">#CMakeLists.txt  
  2. SET(LIBHELLO_SRC hello.c)  
  3. ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})  
  4. ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})  
  5. SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")  
  6. #SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)  
  7. SET(CMAKE_INSTALL_PREFIX /home/hewenjia/test/cmaketest/cmake_practice)  
  8. INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)  
  9. </span>  

2) 调用外部共享库和头文件

新建目录t4用于存放可执行文件工程,再建个src,在src中建CMakeLists.txt,类似前面的步骤,清单1如下:

  1. <span style="font-size:18px; color:#006600">INCLUDE_DIRECTORIES(/home/hewenjia/test/cmaketest/cmake_practice/t3/lib)  
  2. LINK_DIRECTORIES(/home/hewenjia/test/cmaketest/cmake_practice/lib)  
  3. ADD_EXECUTABLE(main main.c)  
  4. TARGET_LINK_LIBRARIES(main libhello.so)</span>  

PS:一定需要在创建main后,在链接库,这个过程可能逻辑上相反,但实现过程的逻辑正确!

清单2 调用函数的main.c文件

  1. <span style="font-size:18px; color:#006600">//main.c  
  2. #include <hello.h>  
  3. int main()  
  4. {  
  5.     HelloFunc();  
  6.     return 0;  
  7. }</span>  

最后运行结果:

CMake总结

参考文献:

[1] http://wenku.baidu.com/view/2fdbbcf3f61fb7360b4c6526.html

[2] http://wenku.baidu.com/view/c172762fb4daa58da0114a54.html