1、变量
CMAKE_CURRENT_BINARY_DIR |
指向当前处理的 CMakeLists.txt 文件对应的构建目录。对于多级目录结构的项目,每个目录的这个变量指向的都是它自己的构建目录 |
CMAKE_SOURCE_DIR |
指向最顶层 CMakeLists.txt 文件的源码目录,即整个项目的根源码目录。在所有的 CMakeLists.txt 文件中保持不变,无论它们在源码树的何处。 |
PROJECT_SOURCE_DIR |
指向最近通过 project() 命令定义的项目的根源码目录。如果是单个项目,则与 CMAKE_SOURCE_DIR 相同。在使用 add_subdirectory 命令嵌套项目时,对于每个子项目来说,它指向的是各自的根源码目录 |
2、设置源文件和头文件
源文件
aux_source_directory(. SRC_LIST) #这里 . 表示当前目录,SRC_LIST 是存放源文件列表的变量
file(GLOB SRC_LIST "src/*.cpp") # 这里file(GLOB ...)命令来查找src目录下所有扩展名为.cpp的文件,并将它们的名字存入SRC_LIST变量
add_subdirectory(src) #进入子目录
头文件
include_directories(
${TOP_DIR}/Include
${TOP_DIR}/Src
)
3、编译库和进程
SET(EXECUTABLE_OUTPUT_PATH ${TOP_DIR}/Bin/$${PLATFORM}) ###设置可执行程序生成路径
SET(LIBRARY_OUTPUT_PATH ${TOP_DIR}/Lib/$${PLATFORM}) #####设置库生成路径
#########设置库属性 源文件和输出名字
set(STATIC_LIB ${PROJECT_NAME}_static)
add_library(${STATIC_LIB} STATIC ${LIB_SRC})
set_target_properties(${STATIC_LIB} PROPERTIES OUTPUT_NAME ${LIB_NAME})
编译选项相关
set(CMAKE_SYSTEM_NAME LINUX)
set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_C_FLAGS "xxx")
set(CMAKE_CXX_FLAGS "xxx")
add_compile_options(-std=c++11 -g) ##增加编译选项
add_definitions(-DXXX) ### 添加宏
调试
message("----- PLAT=${PLAT}")
示例
SET(CMAKE_SYSTEM_NAME LINUX)
SET(CMAKE_C_COMPILER "gcc")
SET(CMAKE_CXX_COMPILER "g++")
SET(CMAKE_C_FLAGS "xxxx")
SET(CMAKE_CXX_FLAGS "xxxx")
CMAKE_MINIMUM_REQUIRED (VERSION 2.8)
PROJECT(test)
SET(TOP_DIR ${PROJECT_SOURCE_DIR})
message("----- PLAT=${PLAT}")
if(PLAT STREQUAL "")
SET(PLAT "x86")
endif()
if(PLAT STREQUAL "x86")
SET(CROSS_FILE ${TOP_DIR}/configs/gcc.cmake)
elseif(PLAT STREQUAL nt98632)
SET(CROSS_FILE ${TOP_DIR}/configs/nt98632.cmake)
elseif(PLAT STREQUAL win64)
SET(CROSS_FILE ${TOP_DIR}/configs/win64.cmake)
else()
SET(CROSS_FILE ${TOP_DIR}/configs/gcc.cmake)
endif()
####
INCLUDE(${CROSS_FILE})
####
INCLUDE_DIRECTORIES(${TOP_DIR}/src/func)
#####
AUX_SOURCE_DIRECTORY(${TOP_DIR}/src SRC_LIST)
AUX_SOURCE_DIRECTORY(${TOP_DIR}/src/func SRC_LIST)
ADD_COMPILE_OPTIONS(-std=c++11 -g)
ADD_EXECUTABLE(test_bin ${SRC_LIST})
IF (CMAKE_SYSTEM_NAME MATCHES "WINDOWS")
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "LINUX")
TARGET_LINK_LIBRARIES(test_bin pthread dl)
ENDIF ()