利用cmake构建项目
主要命令介绍
1.cmake_minimum_required
cmake_minimum_required()命令用来指定cmake最低(高)版本,低于设定版本会报错。设定的最高版本只会影响策略机制其他正常。
#设置最低版本为3.8
cmake_minimum_required (VERSION 3.8)
#设置最低版本为3.12.2最高为3.16.2(最高只影响策略机制)
cmake_minimum_required (VERSION 3.12.2...3.16.2)
2.option
option(OPTION “arm or X86” ON)命令用来申请一个名为OPTION的bool变量,只有在设定值为ON时为1其余任何值均为0。执行cmake命令后会缓存在CMakeCache.txt文件内。之后修改变量值不会生效需使用set(OPTION OFF CACHE BOOL “arm or X86” FORCE)才能修改CMakeCache.txt文件内的值
#申请一个BOOL变量,cmake不传递值的情况下为OFF
option(OPTION "arm or X86" ON)
#修改option设定值方法必须修改CMakeCache.txt内的缓存
set(OPTION OFF CACHE BOOL "arm or X86" FORCE)
3.set
set()命令用来申请变量并存储值。如set(VERSIONT “SV1.010”)申请名为VERSIONT的变量其值为"SV1.010"。
申请一个字符串变量,并赋值为"SV1.010"。
set(VERSIONT "SV1.010")
4.message
message()命令用来打印输出类似echo,printf。如message("版本为 V E R S I O N T " ) 打 印 “ 版 本 为 S V 1.010 ” 其 中 变 量 使 用 {VERSIONT}")打印“版本为 SV1.010”其中变量使用 VERSIONT")打印“版本为SV1.010”其中变量使用{变量}获取。
#输出版本信息
message("版本为 ${VERSIONT}")
5.EXECUTE_PROCESS
EXECUTE_PROCESS()命令为执行一条或多条命令。如EXECUTE_PROCESS( COMMAND ls -ll OUTPUT_VARIABLE BUILDTIMESS)为在当前目录下执行ls -ll命令并将输出结果存放在BUILDTIMESS变量里。
#获取当前目录信息
EXECUTE_PROCESS( COMMAND ls -ll OUTPUT_VARIABLE BUILDTIMESS)
6.if
if()…else()…endif()为逻辑判断命令。
if(OPTION)
message("OPTION 值为 ON")
else()
message("OPTION 值为 OFF")
endif()
7.configure_file
configure_file(“${CMAKE_CURRENT_SOURCE_DIR}/include/config.h.in”
“${CMAKE_CURRENT_SOURCE_DIR}/include/config.h”)
将config.h.in文件输出为config.h文件其宏定义值为CMakeLists.txt的设定值
.in文件
#设置一个为字符串的宏定义
#define TIMES "@TIMES@"
#设置一个宏定义,其值由变量决定
#define VERSIONTYPE "@VERSIONTYPE@"
#设定一个BOOL类型的宏定义,设置非OFF的任意值都为1,不设置或设置OFF为0
#cmakedefine01 LOGSTAT
CMakeLists.txt文件设置
set(VERSIONTYPE "\"SV1.010\"")
set(TIMES "2022-05-05 22:42:47")
设置非OFF的任意值都为1,不设置或设置OFF为0
set(LOGSTAT ON)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/include/config.h.in"
"${CMAKE_CURRENT_SOURCE_DIR}/include/config.h")
.h文件
#define TIMES "2022-05-05 22:42:47"
#define VERSIONTYPE "SV1.010"
#define LOGSTAT 1
8.环境变量设置
# 设置交叉编译工具
set(CMAKE_C_COMPILER /home/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /home/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++)
#设置可执行文件输出目录
SET(EXECUTABLE_OUTPUT_PATH /tmp/share)
#设置库文件生成输出目录
set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib/arm)
# 添加链接库查找目录
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/arm /lib)
# 添加头文件目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/BSform)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/BSmenu)
#编译添加debug选项
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -std=c++11")
# 添加cmake子目录
add_subdirectory(BSform)
add_subdirectory(BSmenu)
add_subdirectory(ncurse)
主CMakeLists.txt构建
#设置cmake版本不低于3.8
cmake_minimum_required (VERSION 3.8)
#交叉编译设定
option(OPTION "arm or X86" ON)
#修改option设定值方法必须修改CMakeCache.txt内的缓存
set(OPTION OFF CACHE BOOL "arm or X86" FORCE)
#编译使用的语言库
option( LANGUAGE "中文 or 英文" ON)
set(LANGUAGE OFF CACHE BOOL "中文 or 英文" FORCE)
设置程序版本
set(VERSIONTYPE "SV1.010")
message("程序版本为 ${VERSIONTYPE}")
#是否打开log日志设非OFF值为1否则为0
set(LOGSTAT ON)
#设置可执行文件输出目录
SET(EXECUTABLE_OUTPUT_PATH /tmp/share)
#交叉编译
if(OPTION)
message( "使用ARM编译")
# 设置交叉编译工具
set(CMAKE_C_COMPILER /home/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /home/bin/arm-linux-gnueabihf-g++)
# 设置库生成库目录
set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib/arm)
# 添加链接库查找目录
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/arm)
else()
message("使用X86编译")
set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib/x86)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/x86 /user/lib)
endif()
#将宏定义写入头文件
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/include/config.h.in" "${CMAKE_CURRENT_SOURCE_DIR}/include/config.h")
#编译添加debug选项
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -std=c++11")
#设置项目名称,需设置在编译信息之后
project(TEST)
#添加头文件目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/BSform)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/BSmenu)
# 添加cmake子目录
add_subdirectory(BSform)
add_subdirectory(BSmenu)
add_subdirectory(ncurse)
子目录CMakeLists.txt
main函数所在目录
set(targetName "Ncurse")
# 项目信息 注意:需要在设置编译工具之后
project(${targetName} )
# 将源代码添加到此项目的可执行文件。
add_executable (${targetName} "main.cpp" )
# 添加编译子目录
target_link_libraries(${targetName} BSform)
target_link_libraries(${targetName} BSmenu)
if(LANGUAGE)
target_link_libraries(${targetName} menuw)
target_link_libraries(${targetName} formw)
target_link_libraries(${targetName} panelw)
target_link_libraries(${targetName} ncursesw)
else()
target_link_libraries(${targetName} menu)
target_link_libraries(${targetName} form)
target_link_libraries(${targetName} panel)
target_link_libraries(${targetName} ncurses)
endif()
其余
project(BSform)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
#add_executable(Demo ${DIR_SRCS})
#指定生成的库为静态链接库
add_library(BSform STATIC ${DIR_SRCS})