cmake安装使用
CMake 是一种跨平台的编译工具,可以自动生成 Makefile 或其他构建系统所需的文件
cmake安装
1、卸载当前旧版本的cmake
查看当前的cmake版本:cmake --version
若版本较旧,执行:sudo apt remove cmake,卸载旧版的cmake
若当前系统无cmake,可跳过这一步。
2、安装依赖
sudo apt install build-essential libssl-dev
3、下载并编译源码
cmake官方下载地址为:https://cmake.org/download/(我下载的是3.17.0)
4、执行以下命令解压:
sudo tar xf cmake-3.17.0.tar.gz
(这里可直接解压到/usr/local里,这样后面生成的可执行文件会在/usr/local/bin里创建链接)
5、环境检查、编译和安装
cd进入解压出来的文件夹,执行:
sudo ./configure
sudo make
sudo make install
6、创建软链接
sudo ln -sf /usr/local/bin/* /usr/bin/
7、再执行:cmake -version
如果出现版本号就代表安装成功。
cmake编译流程
-
编写 CMakeLists.txt 文件。
CMakeLists.txt 文件是 CMake 的重要配置文件,用于描述项目的基本信息和编译过程中需要执行的命令、依赖关系等。具体内容根据项目不同而异,但是一般包括以下内容:
- 项目名称和版本号
- 添加源代码和头文件
- 定义目标和可执行文件
- 链接库和依赖项
- 设置编译器和编译选项
-
创建 build 目录并进入。
在源代码目录外创建一个 build 目录,这个目录用于存放编译生成的文件。进入 build 目录。
-
运行 cmake 命令。
在 build 目录下运行
cmake /path/to/source
命令,/path/to/source
指的是源代码目录的路径。CMake 会解析 CMakeLists.txt 文件,并生成 Makefile 或其他构建系统所需的文件。 -
运行 make 命令进行编译。
在 build 目录下运行
make
命令可以进行编译。make 会根据 Makefile 文件中的规则进行编译,生成可执行文件和一些库文件等。 -
运行 make install 命令进行安装(可选)。
如果需要将编译生成的文件安装到系统中,可以在 build 目录下运行
make install
命令。这个命令会执行 CMake 中指定的安装规则,将文件复制到指定目录。
CmakeLists.txt
-
最小 CMakeLists.txt 文件。
一个最小的 CMakeLists.txt 文件只需要包含以下内容即可:
cmake_minimum_required(VERSION 3.0) project(projname) add_executable(projname main.cpp)
这个文件定义了项目名称、源代码文件和可执行文件。
-
定义变量。
在 CMakeLists.txt 文件中,可以定义一些变量,以便在编译过程中使用。语法如下:
set(VAR value)
这里的 VAR 表示变量名,value 是变量的值。
-
定义源代码和头文件。
源代码和头文件需要在 CMakeLists.txt 文件中进行定义,以便在编译时被正确地包含。语法如下:
include_directories(dir1 dir2 ...) file(GLOB SRC_FILES *.cpp) file(GLOB HEAD_FILES *.h)
这里的 include_directories 定义了头文件所在的路径,file(GLOB SRC_FILES *.cpp) 和 file(GLOB HEAD_FILES *.h) 分别表示匹配所有的 .cpp 和 .h 文件。
-
添加子目录。
如果项目中有多个子目录,可以在 CMakeLists.txt 文件中添加子目录。语法如下:
add_subdirectory(subdir)
这里的 subdir 是子目录的名称。
-
定义目标和可执行文件。
在 CMakeLists.txt 文件中,需要定义编译的目标和可执行文件。语法如下:
add_library(libname ${SRC_FILES} ${HEAD_FILES}) add_executable(exename ${SRC_FILES})
这里的 libname 表示库文件的名称,exename 表示可执行文件的名称。
-
链接库和依赖项。
有时我们需要链接一些外部库,以便在编译过程中使用。语法如下:
target_link_libraries(exename lib1 lib2 ...)
这里的 exename 是可执行文件的名称,lib1、lib2 等是外部库的名称。
shell语法支持
execute_process(COMMAND command [args...]
[WORKING_DIRECTORY dir]
[OUTPUT_VARIABLE var]
[RESULT_VARIABLE var]
[ERROR_VARIABLE var]
[INPUT_FILE file]
[OUTPUT_FILE file]
[ERROR_FILE file]
[INPUT_STRING string]
[TIMEOUT timeout_seconds]
[RESULT_ENCODING encoding]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE]
[ECHO_INPUT_ON])
其中,COMMAND
参数接受一个字符串列表,这个列表中的字符串将被当作 shell 命令来执行。例如:
execute_process(COMMAND mkdir tmp)
这个命令将执行 mkdir tmp
命令创建一个名为 tmp
的目录。
CMAKE内置函数变量
内置函数:
cmake_minimum_required(version)
:指定使用的 CMake 的最低版本。project(name [CXX] [C] [Java])
:定义当前项目的名称和语言类型。add_executable(name [source1] [source2] ...)
:生成可执行文件,需要指定生成可执行文件的名称和相关源文件。add_library(name [STATIC | SHARED | MODULE] [source1] [source2] ...)
:生成库文件,可制定库类型为 STATIC(静态)、SHARED(动态)或 MODULE(插件)。target_link_libraries(target_name lib_name)
:将某个库链接到目标文件中。
内置变量:
CMAKE_SOURCE_DIR
:记录 CMakeLists.txt 文件所在的根目录。CMAKE_BINARY_DIR
:记录用于构建项目的 CMake 编译目录。CMAKE_C_COMPILER
:记录 C 编译器的路径和名称。CMAKE_CXX_COMPILER
:记录 C++ 编译器的路径和名称。CMAKE_BUILD_TYPE
:记录构建的类型,如 Debug 或 Release。
can not find thread
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(CMAKE_USE_WIN32_THREADS_INIT 0)
set(CMAKE_USE_PTHREADS_INIT 1)
set(THREADS_PREFER_PTHREAD_FLAG ON)