【CMake】编译可执行文件

2 篇文章 0 订阅

项目结构

.
├─app
│  ├─CMakeLists.txt
|  └─main.cpp
└─CMakeLists.txt

配置项目

在当前目录下的 CMakeLists.txt为整个项目做一些基本配置,包括项目所需CMake最低版本、项目名称、编译器等,文件内容如下

# ./CMakeLists.txt
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(Compile_Executable_File LANGUAGES CXX)
add_subdirectory(app)

cmake_minimum_required 规定构建当前项目的所需CMake的最低版本,当构建项目使用的CMake不满足做个最低版本要求,则会出现报错,添加 FATAL_ERROR 则在不满足条件的情况下产生致命报错

cmake_minimum_required(VERSION 3.5)
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

CMake语法不区分大小写(即 cmake_minimum_requiredCMAKE_MINIMUN_REQUIRED 是一样的),但是参数区分大小写的

project 声明项目名称(Compile_Executable_File),同时也可以添加参数 LANGUAGES 来显式声明项目的编程语言

project(Compile_Executable_File)
project(Compile_Executable_File LANGUAGES CXX)

CXX代表C++,C++是CMake默认的编程语言

完成对整个项目的基本配置,我们就可以添加子目录 add_subdirectory 来进行编译,我们添加子目录 app 来编译可执行文件

add_subdirectory(app)

配置编译可执行文件

app/CMakeLists.txt 配置编译可执行文件

设置可执行文件输出路径 EXECUTABLE_OUTPUT_PATH${PROJECT_SOURCE_DIR}/bin

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

PROJECT_SOURCE_DIR 是一个默认的变量,这个变量是和根目录下的 CMakeLists.txt 相同目录,或者说是与包含了设置项目名称 project()CMakeLists.txt 目录是相同的

add_executable 将通过编译源文件 main.cpp 来创建一个可执行文件 compile-executable_file(.exe)

add_executable(compile-executable_file main.cpp)
add_executable(${PROJECT_NAME} main.cpp)

你也可以指定输出的名称为项目名称 ${PROJECT_NAME} ,也就是在 project() 指定的项目名称

编写完项目的全部 CMakeLists.txt 文件后,接下来就是如何构建并且编译项目

构建项目和生成构建器

CMake是一个构建系统生成器。将描述构建系统(如:Unix Makefile、Ninja、Visual Studio等)应当如何操作才能编译代码。然后,CMake为所选的构建系统生成相应的指令。默认情况下,

  • GNU/Linux和macOS系统上,Unix Makefile 是默认的生成器
  • Windows上,Visual Studio 是默认的生成器

使用CMake配置项目并生成构建器 (generator) ,我们可以通过命令行界面 (CLI) 进行,也可以通过GUI进行。CMake CLI 提供了许多选项,可以通过 cmake -h 查看。

在根目录下,新建目录 build 并且进入该目录,在 build 目录下,通过指定上级目录的 CMakeLists.txt 来调用 CMake 配置项目并生成构建器

mkdir -p build
cd build
cmake ..
# or specify a generator available the platform
cmake .. -G "MinGW Makefiles"

你可以直接在项目根目录下中执行 cmake .,这是源代码内构建,但是这种做法会在根目录(源代码目录)下生成配置文件,会将源代码和项目的生成树混合,这是非常不推荐的。我们依然会选择源外(out of source)构建项目,即新建目录 build ,并且在目录 build 下构建。

你可以看到这里使用了参数 -G 来指定生成器为 "MinGW Makefiles" (需要有双引号),你可以通过 cmake -h 来查看全部可用的生成器。

当出现如下输出,则已经成功配置项目(Configuring done),并且生成了构建器(Generating done)

-- Configuring done
-- Generating done

你可以在 build 目录下,看到下列文件:

.
├─CMakefiles
├─cmake_install.cmake
├─CMakeCache.txt
└─Makefile
  • CMakefiles :临时文件目录,CMake用于检测操作系统、编译器等。
  • cmake_install.cmake :处理安装规则的CMake脚本,在项目安装时使用。
  • CMakeCache.txt :如文件名所示,CMake缓存。CMake在重新运行配置时使用这个文件。
  • Makefile : 命令 make 将运行指令来编译项目。

编译项目

随后就可以开始编译可执行文件

make
# or
cmake --build .

生成的项目就会在 ${PROJECT_SOURCE_DIR}/bin 下,也就是 bin。如果不通过 set(EXECUTABLE_OUTPUT_PATH ...) 来指定输出目录,那么文件会被输出到 build 目录下

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake是一个跨平台的构建系统。它可以自动生成Makefile或是Visual Studio的项目文件,以达到构建目标的效果。 静态编译指所有用到的第三方库都会被链接到最终的二进制文件中,因此这种方式生成的可执行文件可以在不同的机器上运行,而不必考虑库文件的路径和版本等问题。 下面是一个简单的CMakeLists.txt文件,用于生成一个静态编译的可执行文件。 ```cmake cmake_minimum_required(VERSION 3.5) project(demo) set(CMAKE_CXX_COMPILER "g++") set(CMAKE_CXX_STANDARD 11) set(SOURCES main.cpp) set(LIBRARIES lib1 lib2) include_directories(include) add_executable(demo ${SOURCES}) target_link_libraries(demo ${LIBRARIES}) ``` 在这个例子中,我们定义了一个项目名称为demo,设置了编译器为g++,使用C++11标准进行编译。我们还定义了源码文件名为main.cpp,库文件名为lib1和lib2。在CMakeLists.txt中,我们通过add_executable命令将源码文件编译成可执行文件,并通过target_link_libraries命令将库文件链接到可执行文件中。 在项目目录下执行以下指令: ```bash mkdir build && cd build cmake .. make ``` 即可在build目录下生成可执行文件demo。我们可以使用ldd命令查看可执行文件的依赖关系,发现所有依赖库都已经被链接到了二进制文件中。 ```bash ldd demo ``` 需要注意的是,静态编译的可执行文件可能会比较大,因为它包含了所有的依赖库,因此需要权衡可执行文件的大小和可移植性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值