单文件入门
基本函数
PROJECT(projectname [CXX] [C] [Java])
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …)
ADD_EXECUTABLE([BINARY] [SOURCE_LIST])
例子
文件结构如下:
// main.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("main CMake!!!\n");
return 0;
}
// main2.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("main2 CMake!!!\n");
return 0;
}
源文件及cmake文件在同级目录下
# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程test,他不是执行文件名
# 版本 1.0
PROJECT(test VERSION 1.0)
# 手动加入文件 ${变量名}} ,比如${SRC_LIST}
# CMake 支持大写、小写和混合大小写命令
# 使用SRC_LIST代替源文件,这样需要修改时只需要改一处
SET(SRC_LIST main.c)
set(SRC_LIST2 main2.c)
# MESSAGE和echo类似
MESSAGE(STATUS "PROJECT_BINARY_DIR DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "PROJECT_SOURCE_DIR DIR " ${PROJECT_SOURCE_DIR})
# 生产执行文件名main main2
ADD_EXECUTABLE(main ${SRC_LIST})
ADD_EXECUTABLE(main2 ${SRC_LIST2})
使用CMakeLists.txt
mkdir build && cd build;
cmake ..
多级目录的源文件一同参与编译
例子
build目录同级的cmake
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
PROJECT(test)
ADD_SUBDIRECTORY(src)
MESSAGE(STATUS "TOP CMAKE_CURRENT_SOURCE_DIR -> " ${CMAKE_CURRENT_SOURCE_DIR})
src下的cmake
# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
# PROJECT(test)
# 手动把文件加入项目
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
# 设置子目录
set(SUB_DIR_LIST "${CMAKE_CURRENT_SOURCE_DIR}/dir1" "${CMAKE_CURRENT_SOURCE_DIR}/dir2")
foreach(SUB_DIR ${SUB_DIR_LIST})
# 自动添加头文件路径
INCLUDE_DIRECTORIES(${SUB_DIR})
#遍历源文件
aux_source_directory(${SUB_DIR} SRC_LIST)
MESSAGE(STATUS "SUB_DIR-> " ${SUB_DIR})
MESSAGE(STATUS "SRC_LIST-> " ${SRC_LIST})
endforeach()
# 手动 添加头文件路径
# INCLUDE_DIRECTORIES("dir1")
# INCLUDE_DIRECTORIES("dir2")
ADD_EXECUTABLE(darren ${SRC_LIST} )
把文件编译成库
CMakeList.txt同级目录下还有一个dir.h和dir.c
# 编译debug版本
cmake -DCMAKE_BUILD_TYPE=Debug ..
# 编译release版本
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake_minimum_required(VERSION 2.8s)
project("shared")
# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")
# 不带-g
MESSAGE(STATUS "Release版本")
SET(BuildType "Release")
else()
# -g
SET(BuildType "Debug")
MESSAGE(STATUS "Debug版本")
endif()
#设置lib库目录
# RELEASE_DIR 自定义的变量
SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
# debug和release版本目录不一样
# 设置生成的so动态库最后输出的路径
# SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
# LIBRARY_OUTPUT_PATH
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/${BuildType})
MESSAGE(STATUS "LIBRARY_OUTPUT_PATH: " ${LIBRARY_OUTPUT_PATH})
ADD_COMPILE_OPTIONS(-fPIC)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)
# 默认生成静态库链接库Dir1
#ADD_LIBRARY (Dir1 ${DIR_LIB_SRCS})
# SHARED生成动态库
ADD_LIBRARY (Dir1 SHARED ${DIR_LIB_SRCS})
使用库
基本函数
语法:INCLUDE_DIRECTORIES 找头文件
语法:ADD_SUBDIRECTORY 添加子目录
语法:ADD_LIBRARY 生成库文件
语法:TARGET_LINK_LIBRARIES链接库到执行文件上
语法:AUX_SOURCE_DIRECTORY找在某个路径下的所有源文件
例子
文件格式如下
build目录同级的cmake文件
cmake_minimum_required (VERSION 2.8)
PROJECT(0VOICE)
ADD_SUBDIRECTORY(src)
src目录下的cmake文件
# src目录下的cmake文件
cmake_minimum_required (VERSION 2.8)
# 工程
PROJECT(test)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
# 添加头文件路径
# 绝对路径的方式
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/dir1")
# 相对路径的方式
INCLUDE_DIRECTORIES(dir1)
MESSAGE(STATUS "CMAKE_CURRENT_SOURCE_DIR -> " ${CMAKE_CURRENT_SOURCE_DIR})
# 添加 dir1 子目录
ADD_SUBDIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/dir1")
# 添加头文件路径
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/dir2")
# 添加 dir2 子目录
ADD_SUBDIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/dir2")
ADD_EXECUTABLE(test ${SRC_LIST} )
# 将库链接到可执行文件上
# 引用库文件,如果一个库动态库和静态库都有,优先使用动态库
# 可以这样强制使用静态库:TARGET_LINK_LIBRARIES(test libdir1.a)
TARGET_LINK_LIBRARIES(test dir1 dir2)
源文件下的cmake:
# 查找目录下的所有源文件,放入变量DIR_SRCS中
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
# 默认是静态库,等于ADD_LIBRARY(dir2 STATIC ${DIR_SRCS})
ADD_LIBRARY(dir2 ${DIR_SRCS})
# 编译成动态库
ADD_LIBRARY(dir2 SHARED ${DIR_SRCS})