Cmake使用笔记1

cmake 问题1:

Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.19043.

问题分析

在Windows平台上,使用CMake或Visual Studio等开发工具时,选择正确的Windows SDK版本以确保你的应用程序能够针对目标Windows版本进行编译和运行是很重要的。在你给出的例子中,你希望针对Windows 10版本19043(也称为Windows 10 20H2或更新版本)进行开发,但你选择了Windows SDK版本10.0.19041.0。

Windows SDK版本10.0.19041.0对应于Windows 10 2004(也称为20H1)的更新。虽然它可能包含大多数用于开发Windows 10 20H2应用程序所需的API和工具,但为了确保最佳兼容性和利用新版本的特定功能,你可能想要选择一个更新版本的SDK。

以下是几个步骤,指导你如何在CMake或Visual Studio中选择正确的Windows SDK版本:

在CMake中:

打开CMake GUI或命令行界面。

在配置步骤中,找到设置Windows SDK版本的选项。这通常是通过设置CMAKE_SYSTEM_VERSION变量或类似的变量来完成的,但具体的实现可能因CMake版本和工具链而异。

如果你使用的是CMake的toolchain文件(例如,针对Visual Studio的vs2019.toolchain.cmake),请在该文件中查找并修改SDK版本设置。

重新运行CMake配置步骤,以确保使用新的SDK版本。

在Visual Studio中:

打开你的项目或解决方案。

在"解决方案资源管理器"中,右键点击你的项目,然后选择"属性"。

在项目属性页中,导航到"配置属性">"常规"部分。

在"Windows SDK版本"下拉菜单中,选择与你目标Windows版本相对应的SDK版本。在这个例子中,你可能需要选择一个高于或等于10.0.19043.0的版本(如果可用)。

点击"应用"和"确定"保存更改。

请注意,Windows SDK的版本可能因你的Visual Studio版本和已安装的SDK版本而异。确保你已经安装了与目标Windows版本相对应的SDK版本。你可以通过Visual Studio安装程序或Windows SDK安装程序来安装或更新SDK。

问题解决

在cmake 命令行下

cmake -DCMAKE_SYSTEM_VERSION=8.1 ... 其它 选 项 #指定 windows 8.1 sdk

-DCMAKE_SYSTEM_VERSION=10.0 #这个是指定 用windows 10 sdk

cmake 通过命令行指定输出目录

在 CMake 中,虽然你不能直接在命令行上指定输出目录(即目标文件、库和可执行文件的最终位置),但你可以通过修改 CMakeLists.txt 文件或使用 CMake 的命令行选项来影响构建过程,从而间接地设置输出目录。

不过,如果你想要在命令行中指定构建目录(即 CMake 生成构建系统文件的位置),你可以使用 -B 选项。这个选项允许你指定一个目录,CMake 将在这个目录中生成构建文件(如 Makefile)。但是,这并不直接设置输出目录;它只是改变了构建文件生成的位置。

如果你想要设置输出目录(即构建目标文件的目录),你需要在 CMakeLists.txt 文件中进行设置。这通常是通过设置 CMAKE_RUNTIME_OUTPUT_DIRECTORY、CMAKE_LIBRARY_OUTPUT_DIRECTORY 和 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 变量来实现的。

例如,在 CMakeLists.txt 文件中,你可以这样设置输出目录:

cmake

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)

然后,在命令行中,你可以指定构建目录(使用 -B 选项),并运行 CMake 以生成构建文件:

bash

mkdir build

cd build

cmake -H.../source -B. # 假设你的 CMakeLists.txt 在 source 目录中

在这个例子中,-H.../source 指定了源代码目录(即包含 CMakeLists.txt 的目录),-B. 指定了构建目录(即当前目录)。然后,CMake 将在当前目录下生成构建文件,并根据 CMakeLists.txt 中的设置将构建目标放置在指定的输出目录中。

请注意,这些设置仅影响 CMake 生成的构建系统文件和目标文件的放置位置。实际的构建过程(即编译和链接)将由你选择的构建工具(如 Make、Ninja 等)来执行。

cmake中...意思

在CMake中,... 是一个常见的路径表示,它代表上一级目录。当你在命令行中使用CMake时,这个符号经常与cmake命令结合使用,来指定源代码目录的位置。

具体来说,当你在命令行中运行cmake命令时,你可能需要告诉CMake你的源代码目录(即包含CMakeLists.txt文件的目录)在哪里。如果你当前已经位于源代码目录的某个子目录中,你可以使用...来引用上一级目录。

例如,假设你有以下目录结构:

project/

CMakeLists.txt

src/

main.cpp

build/

如果你当前位于build目录中,并想要从这个目录运行CMake来配置你的项目,你可以使用以下命令:

bash

cmake ...

这里的...表示build目录的上一级目录,即project目录,这是你的源代码目录,其中包含了CMakeLists.txt文件。

所以,cmake ...命令告诉CMake去...(即project目录)中寻找CMakeLists.txt文件,并根据该文件中的指令来配置你的项目。然后,CMake会在当前目录(即build目录)中生成构建文件(如Makefile或Visual Studio项目文件)。

camke 生成命令

CMake 本身并不直接生成可执行文件或库,但它用于配置项目并生成构建系统文件(如 Makefile、Ninja 构建文件、Visual Studio 项目文件等)。这些构建系统文件随后由相应的构建工具(如 Make、Ninja、MSBuild 等)用于编译和链接源代码,生成最终的可执行文件或库。

以下是使用 CMake 生成构建系统文件的一般步骤:

编写 CMakeLists.txt 文件:

在你的项目根目录下,创建一个名为 CMakeLists.txt 的文件。这个文件包含了 CMake 用于配置项目的所有指令。

打开命令行或终端:

打开命令行或终端,并导航到你的项目根目录。

运行 CMake:

使用 CMake 命令来配置项目并生成构建系统文件。CMake 的基本语法是:

bash

cmake [选项] <源代码目录>

或者,如果你想要将构建文件生成到一个与源代码目录不同的目录(通常称为"构建目录"或"输出目录"),你可以使用 -B 选项来指定构建目录:

bash

mkdir build # 创建一个名为 build 的目录来存放构建文件

cd build # 切换到 build 目录

cmake ... # 配置项目,并在当前目录(build)中生成构建文件

在这个例子中,... 表示上一级目录,即源代码目录。

使用构建工具:

一旦 CMake 完成了配置并生成了构建系统文件,你就可以使用相应的构建工具来编译和链接源代码了。例如,如果你生成了 Makefile,你可以使用 make 命令来构建项目:

bash

make # 在 build 目录中运行,以构建项目

如果你生成了 Visual Studio 项目文件,你可以直接打开这些文件并在 Visual Studio 中构建项目。

指定生成器:

在某些平台上,你可能需要指定 CMake 应该使用哪个构建系统生成器。例如,在 Windows 上,你可以使用 -G 选项来指定使用 Visual Studio 的某个版本:

bash

cmake -G "Visual Studio 16 2019" ... # 使用 Visual Studio 2019 生成器

在 Linux 或 macOS 上,你可能不需要指定生成器,因为 CMake 会默认使用 Makefile 或 Ninja。

其他 CMake 选项:

CMake 提供了许多其他选项和标志,用于控制配置过程的各个方面。你可以通过运行 cmake --help 来查看完整的选项列表和说明。

请注意,上述步骤中的命令和选项可能会根据你的具体项目和开发环境而有所不同。务必查阅 CMake 的官方文档以获取最准确和最新的信息。

cmake构建

cmake --build 命令用于构建由 CMake 生成的构建系统。在 CMake 中,你通常会先运行 cmake 命令来配置你的项目并生成构建文件(例如 Makefiles、Ninja 构建文件或 Visual Studio 项目文件),然后你可以使用 cmake --build 来实际构建(编译、链接等)你的项目。

cmake --build 命令的语法大致如下:

bash

cmake --build

...\] \[-- \[...\]

:是包含 CMake 生成的构建文件的目录。这通常是你的构建目录(binary directory 或 out-of-source build directory),但也可以是源目录(source directory),如果你选择了在那里生成构建文件。 :是 cmake --build 命令的选项。例如,你可以使用 --target 选项来指定要构建的特定目标(例如,如果你的项目有多个可执行文件或库)。 [...]:是传递给底层构建工具(如 make、ninja、msbuild 等)的选项。这些选项应该用 -- 分隔,以与 cmake --build 的选项区分开来。 例如,如果你使用 cmake 在名为 build 的目录中生成了 Makefiles,并且你想要构建名为 my_program 的目标,你可以使用以下命令:

bash

cmake --build build --target my_program

如果你只是想要构建默认的目标(通常是 all),你可以省略 --target 选项:

bash

cmake --build build

如果你的项目是为 Visual Studio 生成的,并且你想要使用 Visual Studio 的构建系统来构建它,你可以这样做:

bash

cmake --build build --config Release -- /m

在这个例子中,--config Release 指定了要构建的配置(在这种情况下是 Release 配置),而 /m 是传递给 MSBuild 的选项,用于启用多核并行构建。注意 /m 前面有一个 --,用于分隔 cmake --build 的选项和 MSBuild 的选项。

windows 下使用gcc编译 cmake

在 Windows 下使用 GCC 编译器和 CMake 来构建 C 或 C++ 项目,你需要先安装 GCC 编译器(比如 MinGW 或 MinGW-w64)以及 CMake。以下是步骤的概述:

  1. 安装 MinGW 或 MinGW-w64
    你可以从 MinGW 或 MinGW-w64 的官方网站下载并安装它们。MinGW-w64 是 MinGW 的一个分支,提供了对 Windows 64 位平台的支持。
    安装过程中,请确保将 MinGW 的 bin 目录添加到系统的 PATH 环境变量中,以便你可以在命令行中直接调用 GCC 编译器。
  2. 安装 CMake
    你可以从 CMake 的官方网站下载 Windows 安装程序并安装它。
    同样地,确保将 CMake 的 bin 目录添加到系统的 PATH 环境变量中。
  3. 创建 CMakeLists.txt 文件
    在你的项目根目录下创建一个名为 CMakeLists.txt 的文件。这个文件定义了你的项目如何被 CMake 配置和构建。
    在 CMakeLists.txt 文件中,你需要指定编译器、源文件、库依赖等。例如:
    cmake
    cmake_minimum_required(VERSION 3.10)

project(MyProject)

设置 C 标准为 C99(如果需要)

set(CMAKE_C_STANDARD 99)

set(CMAKE_C_STANDARD_REQUIRED ON)

添加源文件

add_executable(my_program main.c)

  1. 使用 CMake 配置项目

打开命令行(例如,CMD、PowerShell 或 Git Bash)。

导航到你的项目目录。

创建一个构建目录(通常是 build),并切换到该目录。

运行 cmake ... 命令来配置你的项目。这个命令会读取 CMakeLists.txt 文件,并在当前目录下生成构建文件(例如,Makefiles)。

bash

mkdir build

cd build

cmake ...

  1. 使用 GCC 编译项目

如果你的 CMakeLists.txt 文件中没有指定生成器(generator),CMake 会根据系统的默认环境选择一个生成器。在 Windows 上,它通常会选择 NMake 或 MSBuild,而不是直接使用 GCC。但是,由于你已经安装了 MinGW,并且 CMake 检测到了它,它可能会使用 MinGW 的 Makefile 生成器。

要使用 GCC 编译项目,你可以运行 cmake --build . 命令。这个命令会调用底层的构建系统(在这种情况下是 MinGW 的 Makefile)来编译你的项目。

bash

cmake --build .

注意事项:

如果你想要明确指定使用 MinGW 的 Makefile 生成器,你可以在配置项目时通过 -G "MinGW Makefiles" 选项来指定它。但是,通常 CMake 会自动检测并使用适当的生成器。

如果你的项目依赖于其他库,并且这些库已经作为 MinGW 包的一部分安装在你的系统中,你需要在 CMakeLists.txt 文件中找到并链接这些库。这通常涉及到使用 find_library() 或 find_package() 命令来查找库,并使用 target_link_libraries() 命令将它们链接到你的目标上。

如果你在编译过程中遇到任何问题,请检查你的 CMakeLists.txt 文件是否正确配置了你的项目,并确保所有依赖项都已正确安装和配置。

安装gcc

教程链接

windows 下使用gcc编译 cmake

在 Windows 下使用 GCC 编译器和 CMake 来构建 C 或 C++ 项目,你需要先安装 GCC 编译器(比如 MinGW 或 MinGW-w64)以及 CMake。以下是步骤的概述:

  1. 安装 MinGW 或 MinGW-w64
    你可以从 MinGW 或 MinGW-w64 的官方网站下载并安装它们。MinGW-w64 是 MinGW 的一个分支,提供了对 Windows 64 位平台的支持。
    安装过程中,请确保将 MinGW 的 bin 目录添加到系统的 PATH 环境变量中,以便你可以在命令行中直接调用 GCC 编译器。
  2. 安装 CMake
    你可以从 CMake 的官方网站下载 Windows 安装程序并安装它。
    同样地,确保将 CMake 的 bin 目录添加到系统的 PATH 环境变量中。
  3. 创建 CMakeLists.txt 文件
    在你的项目根目录下创建一个名为 CMakeLists.txt 的文件。这个文件定义了你的项目如何被 CMake 配置和构建。
    在 CMakeLists.txt 文件中,你需要指定编译器、源文件、库依赖等。例如:
    cmake
    cmake_minimum_required(VERSION 3.10)

project(MyProject)

设置 C 标准为 C99(如果需要)

set(CMAKE_C_STANDARD 99)

set(CMAKE_C_STANDARD_REQUIRED ON)

添加源文件

add_executable(my_program main.c)

  1. 使用 CMake 配置项目

打开命令行(例如,CMD、PowerShell 或 Git Bash)。

导航到你的项目目录。

创建一个构建目录(通常是 build),并切换到该目录。

运行 cmake ... 命令来配置你的项目。这个命令会读取 CMakeLists.txt 文件,并在当前目录下生成构建文件(例如,Makefiles)。

bash

mkdir build

cd build

cmake ...

  1. 使用 GCC 编译项目

如果你的 CMakeLists.txt 文件中没有指定生成器(generator),CMake 会根据系统的默认环境选择一个生成器。在 Windows 上,它通常会选择 NMake 或 MSBuild,而不是直接使用 GCC。但是,由于你已经安装了 MinGW,并且 CMake 检测到了它,它可能会使用 MinGW 的 Makefile 生成器。

要使用 GCC 编译项目,你可以运行 cmake --build . 命令。这个命令会调用底层的构建系统(在这种情况下是 MinGW 的 Makefile)来编译你的项目。

bash

cmake --build .

注意事项:

如果你想要明确指定使用 MinGW 的 Makefile 生成器,你可以在配置项目时通过 -G "MinGW Makefiles" 选项来指定它。但是,通常 CMake 会自动检测并使用适当的生成器。

如果你的项目依赖于其他库,并且这些库已经作为 MinGW 包的一部分安装在你的系统中,你需要在 CMakeLists.txt 文件中找到并链接这些库。这通常涉及到使用 find_library() 或 find_package() 命令来查找库,并使用 target_link_libraries() 命令将它们链接到你的目标上。

如果你在编译过程中遇到任何问题,请检查你的 CMakeLists.txt 文件是否正确配置了你的项目,并确保所有依赖项都已正确安装和配置。

相关推荐
大筒木老辈子1 小时前
Linux笔记---协议定制与序列化/反序列化
网络·笔记
草莓熊Lotso2 小时前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他
我爱挣钱我也要早睡!4 小时前
Java 复习笔记
java·开发语言·笔记
汇能感知9 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun9 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao10 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾10 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT11 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
ST.J11 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
Suckerbin11 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全