当涉及多个文件交叉编译时可以直接写Makefile文件,执行make命令直接编译程序,当然也可以编写CmakeList.txt文件,通过cmake命令自动生成Makefile文件,下面总结一下常用的命令:
CmakeList.txt示例:
一、#外层CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) #cmake最低版本需求,不加入此行会受到警告信息
PROJECT(HELLO) #项目名称
ADD_SUBDIRECTORY( src ) #指明本项目包含一个子目录 src
AUX_SOURCE_DIRECTORY(. SRC_LIST) #把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST
ADD_EXECUTABLE(hello ${SRC_LIST}) #生成应用程序 hello (在windows下会自动生成hello.exe)
#add_executable(Demo main.cc MathFunctions.cc)
TARGET_LINK_LIBRARIES( main Test ) #指明可执行文件 main 需要连接一个名为Test的链接库 该指令的作用为将目标文件与库文件进行链接
二、#src层CMakeLists.txt
AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS) #
ADD_LIBRARY ( Test ${DIR_TEST1_SRCS}) #将 src 目录中的源文件编译为共享库 [STATIC | SHARED ] 默认状态下,库文件将会在于源文件目录树的构建目录树的位置被创建
其他命令语法:
1、CMAKE_MINIMUM_REQUIRED
CMAKE_MINIMUM_REQUIRED(VERSION2.5 FATAL_ERROR)最低版本CMAKE要求
2、LINK_DIRECTORIES(库文件路径)
LINK_DIRECTORIES(directory1 directory2 ...)
link_directories #该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。
#不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到 link_directories(lib)
3、INCLUDE_DIRECTORIES(${LIBDB_CXX_INCLUDE_DIR})
4、SET(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules ${CMAKE_SOURCE_DIR}/cmake/modules)
5、PROJECT(工程名字)
这条指令会自动创建两个变量: <projectname>_BINARY_DIR(二进制文件保存路径) <projectname>_SOURCE_DIR(源代码路径)
cmake系统也帮助我们预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR其值与上述对应相等
6、SET(变量名 变量值)
SET(VAR [VALUE] [CACHE TYPEDOCSTRING [FORCE]])
SET(SRC_LIST main.c t1.ct2.c)
SET(SRC_LIST main.c)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)更改生成的可执行文件路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)更改生成的库文件路径
7、ADD_EXECUTABLE(可执行文件名 生成该可执行文件的源文件)
说明源文件需要编译出的可执行文件名
例:ADD_EXECUTABLE(hello ${SRC_LIST}) 说明SRC_LIST变量中的源文件需要编译出名为hello的可执行文件
8、ADD_SUBDIRECTORY(src_dir [binary_dir] [EXCLUDE_FROM_ALL])
向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置
EXCLUDE_FROM_ALL含义:将这个目录从编译过程中排除
9、ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
生成动态静态库
例: ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
同时生成动态静态库
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
10、INCLUDE_DIRECTORIES(追加标志 头文件路径)
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
向工程添加多个特定的头文件搜索路径,路径之间用空格分隔,如果路径包含空格,可以使用双引号将它括起来。默认的行为是追加到当前头文件搜索路径的后面。有如下两种方式可以控制搜索路径添加的位置:
CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过SET这个cmake变量为on,可以将添加的头文件搜索路径放在已有路径的前面
通过AFTER或BEFORE参数,也可以控制是追加还是置前
11、AUX_SOURCE_DIRECTORY
AUX_SOURCE_DIRECTORY(dirVARIABLE)
作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中
AUX_SOURCE_DIRECTORY(. SRC_LIST)
12、FIND_LIBRARY(libX X11 /usr/lib)