赞
踩
1.cmake可以跨平台对项目进行管理,如需增加/减少源文件,对于不同的平台,只需要修改CMakeLists.txt文件内容即可。
1.变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名。
2.指令是大小写无关的,参数和变量是大小写相关的。但,推荐全部使用大写指令。
1.cmake_minimum_required指定Cmake的最小版本要求
语法:cmake_minimum_required(VERSION version number[FATAL_ERROR]
代码实例
#当前cmake的最低版本要求 3.10
cmake_minimum_required (VERSION 3.10)
2.project 定义工程名称,并指定工程支持的语言
语法:project(projectname option)
代码实例
set (TOP_PROJECT_NAME "mytest") # 定义了变量TOP_PROJECT_NAME为"mytest"
project (${TOP_PROJECT_NAME}) //指定工程名称为变量
project ("lv_demo_hub")
project (HELLOWORLD)
project (mytest LANGUAGES “CPP”) //检查编译器是否存在
project (mytest VERSION 1.1) //指定工程版本号
project (mytest DESCRIPTION “This is mytest project.”) //添加对工程的描述
project (mytest HOMEPAGE_URL “https://www.XXX(示例).com”) //指定工程的URL
project (mytest “CXX”) // 指定语言为c++ ,跟在工程名称后可以省略关键字LANGUAGES
project (mytest VERSION 1.2 LANGUAGES “CXX”) //跟在版本号后,必须带关键字
细节注意:
3.set 显式定义变量
语法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
代码实例
#定义SRC变量
set(SRC hello.cpp main.cpp) //SRC标量指向一个列表,列表里包含指定所有文件
4. include_directories 向工程添加多个特定的头文件搜索路径,相当于指定g++编译器的-l参数
语法:include_directories(AFTER [BEFORE] [SYSTEM] dir1 dir2 …)
代码实例:
include_directories(/usr/include/myincludefolder ./include)
5.link_directories 向工程内添加多个特定的库文件搜索路径,相当于指定g++编译器的-L参数
语法:link_directories(dir1 dir2)
代码实例:
#将/usr/lib/mylibfolder和./lib添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib);
6.add_library 生成库文件
语法:add_library(libname [SHARED|STATIC|MUDULE] [EXCLUDE_FROM_ALL] source1 source2 …)
代码示例:
通过变量SRC生成libhello.so,libhello.a等库
add_library(hello SHARED ${SRC})
add_library(hello STATIC${SRC})
add_library(hello MUDULE${SRC})
7.add_compile_options 添加编译参数
语法:add_compile_optins( …)
代码示例
add_compile_optins(-Wall -std=c++11 -o2)
8.add_executable生成可执行文件
语法:add_executable(exename source1 source2 …)
代码实例
add_executable(main main.cpp); //将main.cpp生成可执行文件main
9.target_link_libraries 为target添加需要链接的共享库,相当于指定g++编译器-l 参数
语法:target_link_libraries(target library1<debug | optimized>library2)
代码实例:
target_link_libraries(main hello) //hello动态库链接到可执行文件main
10.add_subdirectory 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
代码实例:
add_subdirectory(src) //添加src子目录,src中需要一个CMakeList.txt
11.aux_source_directory 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个变量临时被用来自动构建源文件列表
语法:aux_source_directory(dir VARIABlE)
代码实例:
aux_source_directory(. SRC) //定义SRC变量,其值为当前目录下所有的源代码文件
add_executable(main ${SRC}) //编译SRC变量所代表的源代码文件,生成main可执行文件
1.CMAKE_C_FLAGS和CMAKE_CXX_FLAGS
设置 C 或c++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
代码实例:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS } -Wall") //在gcc编译选项中追加-Wall
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") //在gcc编译选项中追加-std=c++11
2.CMAKE_BUILD_TYPE
编译类型为Debug和Release
代码实例:
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_BUILD_TYPE Release)
3.CMAKE_CXX_COMPILER 和CMAKE_C_COMPILER
设置c和c++,编译器
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
4.EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH
指定可执行文件和库文件的输出路径
代码实例:
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${OUTPUT_PATH})
5.PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR
/home/chen/workplace/code_test/
├── build
├── CMakeLists.txt
└── main.c
CMakeLists.txt文件内容如下:
#CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO)
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})
进入到 build目录下,执行 cmake:得到如下打印
/home/chen/workplace/code_test/cmake_test
/home/chen/workplace/code_test/cmake_test/build
6.CMAKE_SOURCE_DIR和CMAKE_BINARY_DIR
CMAKE_SOURCE_DIR 与 PROJECT_SOURCE_DIR 等价
CMAKE_BINARY_DIR 与 PROJECT_BINARY_DIR 等价
7.CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_BINARY_DIR
CMAKE_CURRENT_SOURCE_DIR 当前源码所在路径,也就是CMakeLists.txt完整路径
CMAKE_CURRENT_BINARY_DIR 当前源码的 BINARY_DIR
使用add_definitions可以添加宏
代码实例:
add_definitions(-DF_UBUNTU)
等价于
#define F_UBUNTU 1
或者
cmake -DUSE_MACRO=on //开启
cmake -DUSE_MACRO=off //关闭
.cmake文件是一个’模块(module)文件’,可以被’include’到CMakeLists.txt中,
备注: cmake’脚本’不要包含’工程之类’的信息 -->例如:add_subdirectory()、CMAKE_CURRENT_之类的,
cmake’不要’调用CMakeLists.txt
代码实例:
CMakeLists.txt文件中添加下列代码
include(${CMAKE_CURRENT_LIST_DIR}/cmake_conf/common.cmake)
common.cmake内容如下
# 生成静态库通用宏
macro(add_static_lib _name _path)
file(GLOB_RECURSE SRC_FILES "${_path}/*.c")
file(GLOB_RECURSE HEAD_FILES "${_path}/*.h" "./*.h" )
add_library(${_name} STATIC ${SRC_FILES} ${HEAD_FILES})
#后面所有参数添加连接库
foreach(_lib_item ${ARGN})
target_link_libraries(${_name} ${_lib_item})
endforeach(_lib_item)
endmacro(add_static_lib)
或
# the name of the target operating system
set(CMAKE_SYSTEM_NAME linux)
# which compilers to use
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
# adjust the default behaviour of the find commands:
# search headers and libraries in the target environment
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
# search programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
1.工程代码结构,遵循所有源文件放在src目录,所有头文件放在include目录,所有库放在lib目录下
2.CMakeLists.txt文件内容
#cmake version required
cmake_minimum_required (VERSION 3.12)
project(Test VERSION 1.2 LANGUAGES "CXX")
message("cmake_project_version = ${CMAKE_PROJECT_VERSION}")
message("project_version = ${PROJECT_VERSION}")
message("project_major_version= ${PROJECT_VERSION_MAJOR}")
message("project_minor = ${PROJECT_VERSION_MINOR}")
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
message("executable_output_path = ${EXECUTABLE_OUTPUT_PATH}")
message("library_output_path = ${LIBRARY_OUTPUT_PATH}")
message("cmake current source_dir =${CMAKE_CURRENT_SOURCE_DIR}")
message("cmake_current_binray_dir =${CMAKE_CURRENT_BINARY_DIR}")
message("project_source_dir = ${PROJECT_SOURCE_DIR}")
message("project_binray_dir = ${PROJECT_BINARY_DIR}")
message("cmake source dir = ${CMAKE_SOURCE_DIR}")
message("cmake_binray_dir =${CMAKE_BINARY_DIR}")
#configure_file(<input> <output>
# [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
# FILE_PERMISSIONS <permissions>...]
# [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
# [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
# option(variable_name "help message" value(bool OFF or ON)
set(DEMO_DATE "2020-8-17")
option(VERSION_ENABLE "version output" ON)
if(VERSION_ENABLE)
set(DEMO_VERSION "12-34-56")
endif()
configure_file(${PROJECT_SOURCE_DIR}/include/version.h.in
${PROJECT_SOURCE_DIR}/include/version.h
)
add_executable(demo ${PROJECT_SOURCE_DIR}/src/main.cpp)
#为demo添加使用的头文件
target_include_directories(demo PUBLIC
${PROJECT_SOURCE_DIR}/include/
)
#为所有文件添加使用的头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
3.cmake工程构建
进入根目录,执行
mkdir build
cd build
cmake ..
cmake --build . //生成的可执行文件demo在,build/bin/demo
4.main.cpp文件内容
#include <iostream>
#include "version.h"
using namespace std;
int main(){
std::cout<<"hello world"<<endl;
std::cout<<"demo_major_version:"<<Test_VERSION_MAJOR<<endl;
std::cout<<"demo_minor_version:"<<Test_VERSION_MINOR<<endl;
#ifdef DEMO_VERSION
std::cout<<"define demo version:"<<DEMO_VERSION<<endl;
#endif
std::cout<<"Date:"<<DATE<<endl;
return 0;
}
5.version.h.in文件内容,
其中version.h是由version.h.in通过CMakeLists.txt构建生成的
#define Test_VERSION_MAJOR @Test_VERSION_MAJOR@
#define Test_VERSION_MINOR @Test_VERSION_MINOR@
#define DATE "${DEMO_DATE}"
#cmakedefine DEMO_VERSION "${DEMO_VERSION}"
此模块可以作为一个通用模块,会自动搜寻指定目录下的.c和.h
#file name@common.cmake
# 生成静态库通用宏
macro(add_static_lib _name _path)
file(GLOB_RECURSE SRC_FILES "${_path}/*.c")
file(GLOB_RECURSE HEAD_FILES "${_path}/*.h" "./*.h" )
add_library(${_name} STATIC ${SRC_FILES} ${HEAD_FILES})
#后面所有参数添加连接库
foreach(_lib_item ${ARGN})
target_link_libraries(${_name} ${_lib_item})
endforeach(_lib_item)
endmacro(add_static_lib)
在cmake中使用
include(${CMAKE_CURRENT_LIST_DIR}/common.cmake)
add_static_lib(my_lib my_lib)
参考定义
- "macro(add_static_lib _name _path)"
- add_static_lib :函数名
- _name:静态库的名字
- _path:生成静态库依赖文件路径
1.添加一个TEST宏定义
示例如下
add_definitions(-DTEST)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。