当前位置: 首页 > news >正文

Linux CMakeLists编写之可执行程序

目录

  • 1 概述
  • 2 文件命名
  • 3 实例
  • 4 代码分析

1 概述

  编译工具有很多(make/cmake/BJam)。cmake是跨平台,使用cmake编译需要编写CMakeLists.txt。本文编写CMakeLists.txt来生成C++可执行程序。

2 文件命名

文件命名为CMakeLists.txt,是一个文本文件,可以使用任何编辑器编辑。
本文使用cmake程序版本:

```bash
$cmake --version
cmake version 3.16.3CMake suite maintained and supported by Kitware (kitware.com/cmake)

3 实例

这里以CppTest库测试代码为例,代码目录结构:

test$ tree
.
├── CMakeLists.txt
├── cmdtest.cpp
├── cmdtest.h
├── inc
│   └── cpptest
│       ├── cpptest-assert.h
│       ├── cpptest-collectoroutput.h
│       ├── cpptest-compileroutput.h
│       ├── cpptest-htmloutput.h
│       ├── cpptest-output.h
│       ├── cpptest-source.h
│       ├── cpptest-suite.h
│       ├── cpptest-textoutput.h
│       ├── cpptest-time.h
│       └── cpptest.h
├── lib
│   └── libcpptest.a
└── test.cpp3 directories, 15 files

CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 3.13)set(CPPCMD_VERSION 1.0.0)                                         
project(test VERSION ${CPPCMD_VERSION} LANGUAGES CXX)                         set(EXECUTABLE_OUTPUT_PATH  ${CMAKE_BINARY_DIR}/bin)
set(CPPCMD_LIB_DIR ../install  CACHE STRING "cppcmd lib dir")   
include_directories(../cppcmd/inc ./inc)
file(GLOB SRC *.cpp)                                                          set(CMAKE_CXX_FLAGS "-std=c++11")                                             add_executable(${PROJECT_NAME} ${SRC})                                        target_link_libraries(${PROJECT_NAME} cppcmd cpptest)                 
target_link_directories(${PROJECT_NAME} PRIVATE  lib ${CPPCMD_LIB_DIR}/lib) 
install(TARGETS ${PROJECT_NAME} DESTINATION bin)         

编译结果:

test$ mkdir build
test$ cd build/
build$ cmake ../ -DCPPCMD_LIB_DIR=../install
-- The CXX compiler identification is GNU 10.5.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/james/git/cppcmdv1.0.0/test/build
build$ make
Scanning dependencies of target test
[ 33%] Building CXX object CMakeFiles/test.dir/cmdtest.cpp.o
[ 66%] Building CXX object CMakeFiles/test.dir/test.cpp.o
[100%] Linking CXX executable bin/test
[100%] Built target test

说明:

  • 编译生成可执行程序test文件放在build/bin目录下
  • 编译生成.o放在build/CMakeFiles/test.dir/目录下

4 代码分析

# 设置使用cmake的最小版本,这里最小版本是3.12
cmake_minimum_required(VERSION 3.13)# 设置变量CPPCMD_VERSION,其值为1.0.0
set(CPPCMD_VERSION 1.0.0)
# 设置工程名称,版本,开发语言                                              
project(test VERSION ${CPPCMD_VERSION} LANGUAGES CXX)                         # 设置可执行程序输出路径为build/bin
set(EXECUTABLE_OUTPUT_PATH  ${CMAKE_BINARY_DIR}/bin)
# 设置cppcmd库路径
set(CPPCMD_LIB_DIR ../install  CACHE STRING "cppcmd lib dir")   
# 设置include路径,这里是上一级cppcmd/inc和当前路径下inc目录
include_directories(../cppcmd/inc ./inc)
# 行设置要编译的源文件,这里将当前路径下所有cpp文件名称,放在变量SRC中
file(GLOB SRC *.cpp)                                                          # 设置定义C++编译选项,C++使用C++11标准
set(CMAKE_CXX_FLAGS "-std=c++11")                                             # 添加可执行目标,并设置可执行程序名称及依赖的源文件
add_executable(${PROJECT_NAME} ${SRC})                                        # 设置可执行程序依赖库,这里是cppcmd和cpptest
target_link_libraries(${PROJECT_NAME} cppcmd cpptest)         
# 设置依赖库的搜索路径,这里是./lib和build/lib             
target_link_directories(${PROJECT_NAME} PRIVATE  lib ${CPPCMD_LIB_DIR}/lib) 
# 安装可执行程序
install(TARGETS ${PROJECT_NAME} DESTINATION bin)  

说明:

  • 变量CPPCMD_LIB_DIR为CACHE变量,默认值为…/install即源码目录的上一级目录下的install
  • 可以通过命令行参数修改:
  cmake ../ -DCPPCMD_LIB_DIR=/usr/local/cppcmd

相关文章:

  • Linux下编程之内存检查
  • 使用AI工具 Baidu Comate 辅助编码 快速定位修改Bug
  • 数据结构——队列练习题
  • 解决前后端同一个端口跨域问题
  • 如何在Java中实现高性能的网络通信
  • C#中的容器
  • 鸿蒙开发设备管理:【@ohos.usb (USB管理)】
  • 人工智能在医疗领域的革命性应用
  • LeetCode.68文本左右对齐
  • 无偏归一化自适应心电ECG信号降噪方法(MATLAB)
  • 2024暑假集训第四次考试(终极测试)
  • git-extras
  • 【AI-小米机器狗】Dockerfile包含SSH和SFTP
  • ASP.NET Core 6.0 使用 Action过滤器
  • 【笔记】字符串相似度代码分享
  • Google 是如何开发 Web 框架的
  • hexo+github搭建个人博客
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • css属性的继承、初识值、计算值、当前值、应用值
  • JavaWeb(学习笔记二)
  • java第三方包学习之lombok
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • MySQL QA
  • node和express搭建代理服务器(源码)
  • Sequelize 中文文档 v4 - Getting started - 入门
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 从输入URL到页面加载发生了什么
  • 后端_ThinkPHP5
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 写给高年级小学生看的《Bash 指南》
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • python最赚钱的4个方向,你最心动的是哪个?
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​iOS安全加固方法及实现
  • # Panda3d 碰撞检测系统介绍
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • ## 1.3.Git命令
  • #Lua:Lua调用C++生成的DLL库
  • (20050108)又读《平凡的世界》
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Python第六天)文件处理
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (算法)前K大的和
  • (学习日记)2024.01.19
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • .NET 5种线程安全集合
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET 事件模型教程(二)
  • .net 无限分类