浅浅的 Cmake
目录
- 一、Cmake安装和基本使用
- 1、下载Cmake
- 2、尝试第一次编译
- 3、替换成变量
- 二、Cmake头文件
- 1、在原来的项目路径基础上可以增加main.h头文件
- 2、增加头文件
- 三、添加多个源文件和多组源文件
- 四、包含其他库文件
- 五、生成库文件
- 七、
- CMake常用变量
- 使用CMake交叉编译Arm Linux程序
参考资源:
https://zhuanlan.zhihu.com/p/119426899
https://blog.csdn.net/fengzhongluoleidehua/article/details/79809756
https://blog.csdn.net/dabenxiong666/article/details/53998998
添加头文件 https://blog.csdn.net/weixin_44100850/article/details/103697973
一、Cmake安装和基本使用
1、下载Cmake
环境Ubuntu18
sudo apt install cmake
查看版本号
sudo cmake --version
2、尝试第一次编译
建立一个文件夹,里面有:
测试源文件:main.cpp
Cmake文件:CMakeLists.txt
一个存放编译文件的空文件夹:bulid
main.cpp:
#include <stdio.h>
int main (int argc, char *argv[])
{
printf("123\n");
return 0;
}
CmakeLists.txt
3、替换成变量
https://www.cnblogs.com/narjaja/p/9533174.html
# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3)
# 设置工程名称,最后输出的可执行文件名称
project(App)
# 添加可执行文件添加需要编译的文件
add_executable(App main.cpp)
进入到bulid目录下,开始编译
Cmake ..
make
最终得到可执行文件App。
使用变量替换生存的执行文件:
# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3)
#通过PROJECT指令定义的项目名称 :https://www.cnblogs.com/narjaja/p/9533174.html
set (PROJECT_NAME tianxiaohua)
# 设置工程名称,最后输出的可执行文件名称
project(${PROJECT_NAME})
# 添加可执行文件添加需要编译的文件
add_executable(${PROJECT_NAME} main.cpp)
二、Cmake头文件
https://www.cnblogs.com/binbinjx/p/5626916.html
1、在原来的项目路径基础上可以增加main.h头文件
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR 0
#define Tutorial_VERSION_MINOR 0
修改原来的源文件:
// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "main.h"
int main (int argc, char *argv[])
{
if (argc < 2)
{
fprintf(stdout,"%s Version %d.%d\n",argv[0],Tutorial_VERSION_MAJOR,Tutorial_VERSION_MINOR);
fprintf(stdout,"Usage: %s number\n",argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
double outputValue = sqrt(inputValue);
fprintf(stdout,"The square root of %g is %g\n",
inputValue, outputValue);
return 0;
}
2、增加头文件
修改Cmake:
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 …])
它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。
CmakeLists.txt
# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3)
#通过PROJECT指令定义的项目名称
set (PROJECT_NAME tianxiaohua)
# 设置工程名称,最后输出的可执行文件名称
project (${PROJECT_NAME})
# 添加编译选项
add_compile_options(-std=c++11)
# 添加头文件的路径
include_directories(/)
# 添加可执行文件添加需要编译的文件
add_executable(${PROJECT_NAME} main.cpp)
重新进入bulid文件内,编译执行。
三、添加多个源文件和多组源文件
cmake自动添加所有源文件和头文件 https://blog.csdn.net/sep4075/article/details/120001415
1、新建多个源文件和头文件
2、新的cmake源码
参考:https://www.cnblogs.com/dilex/p/11102152.html
# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3)
#通过PROJECT指令定义的项目名称
set (PROJECT_NAME tianxiaohua)
# 设置工程名称,最后输出的可执行文件名称
project (${PROJECT_NAME})
# 添加编译选项
add_compile_options(-std=c++11)
# 添加头文件的路径
include_directories(Include)
# 查找source目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量,遍历获取source/路径下所有的*.cpp和*.c文件列表
file(GLOB_RECURSE SRC_DIR_LIST "Source/*.cpp" "Source/*.c")
# 添加可执行文件添加需要编译的文件
add_executable(${PROJECT_NAME} ${SRC_DIR_LIST})
另外的方法:
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.0)
# 项目名称
project(CMakeFile)
# 设置md5代码文件的路径
set(MD5_FILE "./common/md5/md5.cpp" "./common/md5/md5.h")
# 查找指定目录下的所有.cpp与.h文件 并存放到指定变量名SC_FILES中
FILE(GLOB SC_FILES "*.cpp" "*.h")
# 对md5的源码分组到md5组里
source_group(md5 FILES ${MD5_FILE})
# 指定生成目标
add_executable(${PROJECT_NAME} ${SC_FILES} ${MD5_FILE})
四、包含其他库文件
add_executable(。。。)
target_link_libraries(。。。)
五、生成库文件
1、新的Cmake文件
# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3)
#通过PROJECT指令定义的项目名称
set (PROJECT_NAME tianxiaohua)
# 设置工程名称,最后输出的可执行文件名称
project (${PROJECT_NAME})
# 添加编译选项
add_compile_options(-std=c++11)
# 添加头文件的路径
include_directories(Include)
# 查找source目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量,遍历获取source/路径下所有的*.cpp和*.c文件列表
file(GLOB_RECURSE SRC_DIR_LIST "Source/*.cpp" "Source/*.c")
# 将DIR_LIB_SRCS中文件列表以静态库的方式加入工程//将DIR_LIB_SRCS中文件列表以静态库的方式加入工程
add_library(
${PROJECT_NAME} # 生成的输出个输出工程文件名称
STATIC # STATIC生成静态库文件.a SHARED生成动态库文件.so
${SRC_DIR_LIST} # 所有源文件的集合
)
# 打印SRC_DIR_LIST中列表信息
message(STATUS "SRC_DIR_LIST = ${SRC_DIR_LIST}")
# 添加可执行文件添加需要编译的文件
#add_executable(${PROJECT_NAME} main.cpp)
七、
CMake常用变量
变量名 变量说明
PROJECT_NAME 返回通过PROJECT指令定义的项目名称
PROJECT_SOURCE_DIR CMake源码地址,即cmake命令后指定的地址
PROJECT_BINARY_DIR 运行cmake命令的目录,通常是PROJECT_SOURCE_DIR下的build目录
CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_LIST_DIR 当前文件夹路径
CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行
CMAKE_RUNTIME_OUTPUT_DIRECTORY 生成可执行文件路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY 生成库的文件夹路径
CMAKE_BUILD_TYPE 指定基于make的产生器的构建类型(Release,Debug)
CMAKE_C_FLAGS *.C文件编译选项,如 -std=c99 -O3 -march=native
CMAKE_CXX_FLAGS *.CPP文件编译选项,如 -std=c++11 -O3 -march=native
CMAKE_CURRENT_BINARY_DIR target编译目录
CMAKE_INCLUDE_PATH 环境变量,非cmake变量
CMAKE_LIBRARY_PATH 环境变量
CMAKE_STATIC_LIBRARY_PREFIX 静态库前缀, Linux下默认为lib
CMAKE_STATIC_LIBRARY_SUFFIX 静态库后缀,Linux下默认为.a
CMAKE_SHARED_LIBRARY_PREFIX 动态库前缀,Linux下默认为lib
CMAKE_SHARED_LIBRARY_SUFFIX 动态库后缀,Linux下默认为.so
BUILD_SHARED_LIBS 如果为ON,则add_library默认创建共享库
CMAKE_INSTALL_PREFIX 配置安装路径,默认为/usr/local
CMAKE_ABSOLUTE_DESTINATION_FILES 安装文件列表时使用ABSOLUTE DESTINATION 路径
CMAKE_AUTOMOC_RELAXED_MODE 在严格和宽松的automoc模式间切换
CMAKE_BACKWARDS_COMPATIBILITY 构建工程所需要的CMake版本
CMAKE_COLOR_MAKEFILE 开启时,使用Makefile产生器会产生彩色输出
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来控制IF ELSE语句的书写方式
使用CMake交叉编译Arm Linux程序
https://blog.csdn.net/whahu1989/article/details/104114515