C++ 教程 - 05 构建编译

文章目录

  • 构建工具
  • cmake安装与使用
  • CMakeLists.txt编写
  • 使用案例

构建工具

cmake, Cross Platform Make, (对C++)跨平台编译工具,将CMakeLists.txt 文件编译为对应的文件,如linux下的 Makefile,然后使用make命令对Makefile编译,得到二进制可执行文件。
 
下载cmake工具
下载地址:https://github.com/Kitware/CMake/releases

 

cmake安装与使用

这里以CentOS 8.5 为例,进行说明,下载cmake-3.29.6-linux-x86_64.sh;

  • 将下载的cmake-xx.sh拷贝到linux系统下
# scp 基于ssh
scp -r .\cmake-3.29.6-linux-x86_64.sh laufing@192.168.0.109:/home/laufing

在这里插入图片描述
出现以上问题,将known_hosts删除即可;也可以重新配置ssh的免密登录。

  • linux下安装cmake
# 执行sh脚本,进行安装
sh cmake-3.29.6-linux-x86_64.sh
# 一路输入 y# 创建软连接
ln -s /home/laufing/cmake-3.29.6-linux-x86_64/bin/cmake /bin/cmake # 权限不够加sudo# 测试
[laufing@centos ~]$ cmake
Usagecmake [options] <path-to-source>cmake [options] <path-to-existing-build>cmake [options] -S <path-to-source> -B <path-to-build>Specify a source directory to (re-)generate a build system for it in the
current working directory.  Specify an existing build directory to
re-generate its build system.Run 'cmake --help' for more information.

在这里插入图片描述
 

CMakeLists.txt编写

  • 官方文档参考
  • 命令大小写均可;
  • C++项目构建目录结构
    • projectDir
      • build
        • CMakeLists.txt
      • include
      • src
      • lib
  • 如下 CMakeLists.txt常用命令:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.14)# 指定项目名称
project(appName)# 头文件目录
include_directories(/home/user/include)  # 也可以指定多个,空格分割
include_directories(${PROJECT_BINARY_DIR}/../include) # 多次指定# 将src下的源码 放入指定变量中
aux_source_directory(${PROJECT_BINARY_DIR}/../src SRCS) # 可多次指定
# 设置环境变量
set(SRC_PATH ${SRCS}) # 将SRCS变量中的源码 放入SRC_PATH环境变量中
# unset(VAR SRC_PATH)  取消变量# 添加可执行文件
add_executable(app ${SRCS}) # 将SRCS变量中的源码 编译为app可执行文件 ,也可单独指定xx.cpp
# add_executable(app ${SRCS} ${HDRS} ${PROJECT_UIS_H})# 链接库
target_link_libraries(app dl protobuf) # app可执行文件 需要连接的库文件(空格分割或换行)
# 默认到 /lib; /usr/lib; /usr/local/lib下搜索库名 (libdl.so、libprotobuf.so)# 将 指定源码 编译为 动态库/静态库
add_library(libName SHARED ${SRCS}) # SHARED 动态库   STATIC 静态库
# windows 
# lauf.lib 静态库  链接时需要放入项目代码中(项目较大)
# lauf.dll 动态库  链接时,在项目代码仅加入库的指向,执行时再按照指向搜索动态库
# linux下
# liblauf.a  静态库  lauf为库名称
# liblauf.so 动态库 
# 连接so动态库时,若库文件为liblauf.so.0.0.0 , 则需要创建软连接liblauf.so , 然后链入软连接的库名
# ln -s /xx/liblauf.so.0.0.0 liblauf.so# 查找路径
find_path(MY_PATH /home/user/dir1 /home/user/dir2) # 将查找路径存入MY_PATH变量中
# 查找库
find_library(MY_LIB pthread /lib /usr/lib /usr/local/lib) # 在指定路径下查找pthread库,存入MY_LIB变量中
# 查找包
find_package(MY_PKG p1 /xx/xx)
# 文件查找
file(GLOB_RECURSE SRCS ${PROJECT_BINARY_DIR}/../src/*.cpp)  # 查找*.cpp 存入SRCS变量中# 添加编译选项
add_compile_options(-std=c++11 -Wall)
#输出信息
message("xxx") # 关闭控制台
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")

更多参考

  • cmake的系统变量

    • ${PROJECT_BINARY_DIR} 是执行cmake的目录,即build目录;同PROJECT_SOURCE_DIR
    • ${PROJECT_NAME} 项目名称,即project() 指定的
    • ${LIBRARY_OUTPUT_PATH} 库文件的输出目录
    • ${EXECUTABLE_OUTPUT_PATH} 可执行文件的输出目录
  • cmake官网教程

 

使用案例

对如下项目,使用cmake编译。
在这里插入图片描述

  • 创建多个目录
arr=('build' 'include' 'src' 'lib')
for i in ${arr[*]}
domkdir $i
done
  • 编写cpp代码
// tool.h
#ifndef TOOL_H
#define TOOL_H
#endifusing namespace std;
// declare 
const string func(const string& name);  // 字符串的引用  const传参表示函数内部无法通过引用修改变量的值// tool.cpp
#include <iostream>
#include <string>
using namespace std;const string func(const string& name){ // cout << "func run:" << name << endl;return name;
}// main.cpp
#include <iostream>
#include "tool.h"
using namespace std;int main(){const string name = "jack";func(name);return 0;
}
  • 编写CMakeLists.txt

cmake_minimum_required(VERSION 3.14)project(app)include_directories(${PROJECT_BINARY_DIR}/../include)aux_source_directory(${PROJECT_BINARY_DIR}/../src SRCS)set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
add_executable(app ${SRCS})set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)
add_library(appA SHARED ${SRCS})message(${PROJECT_SOURCE_DIR})
message(${PROJECT_NAME})
  • 开始编译
# 进入build目录
cd build
cmake .
make

日志如下:

[laufing@centos build]$ cmake .
-- The C compiler identification is GNU 8.5.0
-- The CXX compiler identification is GNU 8.5.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
/home/laufing/projectDir/build
app
-- Configuring done (0.3s)
-- Generating done (0.0s)
-- Build files have been written to: /home/laufing/projectDir/build
[laufing@centos build]$ make
[ 16%] Building CXX object CMakeFiles/app.dir/home/laufing/projectDir/src/main.cpp.o
[ 33%] Building CXX object CMakeFiles/app.dir/home/laufing/projectDir/src/tool.cpp.o
[ 50%] Linking CXX executable app
[ 50%] Built target app
[ 66%] Building CXX object CMakeFiles/appA.dir/home/laufing/projectDir/src/main.cpp.o
[ 83%] Building CXX object CMakeFiles/appA.dir/home/laufing/projectDir/src/tool.cpp.o
[100%] Linking CXX shared library /home/laufing/projectDir/lib/libappA.so
[100%] Built target appA
  • 测试可执行文件
# 执行
[laufing@centos build]$ ./app
func run:jack

同时在build/lib目录下生成动态库

[laufing@centos projectDir]$ cd lib
[laufing@centos lib]$ ls
libappA.so

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[WTL/Win32]_[中级]_[MVP架构在实际项目中的应用]

场景 在开发Windows和macOS的界面软件时&#xff0c;Windows用的是WTL/Win32技术&#xff0c;而macOS用的是Cocoa技术。而两种技术的本地语言一个主打是C,另一个却是Object-c。界面软件的源码随着项目功能增多而增多&#xff0c;这就会给同步Windows和macOS的功能造成很大负担…

Github 2024-06-21 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3Python项目3Java项目2非开发语言项目2JavaScript项目1Rust项目1Dart项目1HTML项目1Vue项目1C++项目1TensorFlow: 机器学习的开源…

用户和账号

chage、useradd、passwd、usermod、userdel、groupadd、gpasswd、groupdel、groups、 用户账号初始配置文件 .bashrc .bash_profile .bash_logout finger、w、who、users chmod、chowd、umask、last 1.用户的分类 Linux 用户三种角色 超级用户&#x…

LInux驱动开发笔记(十)SPI子系统及其驱动

文章目录 前言一、SPI驱动框架二、总线驱动2.1 SPI总线的运行机制2.2 重要数据结构2.2.1 spi_controller2.2.2 spi_driver2.2.3 spi_device2.2.4 spi_transfer2.2.5 spi_message 三、设备驱动的编写3.1 设备树的修改3.2 相关API函数3.2.1 spi_setup( )3.2.2 spi_message_init( …

使用GPG来解密和加密文件详解

文章目录 使用私钥解密文件示例步骤 注意事项加密文件前提条件导入公钥加密文件输出加密文件示例步骤注意事项邮箱不是必须的情况1&#xff1a;有多个公钥情况2&#xff1a;只有一个公钥示例步骤示例1&#xff1a;指定公钥ID或邮箱地址示例2&#xff1a;密钥环中只有一个相关的…

深度学习论文: Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data

深度学习论文: Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data PDF: https://arxiv.org/abs/2401.10891.pdf 代码:https://github.com/LiheYoung/Depth-Anything PyTorch代码: http…

揭秘最酷的Matplotlib 风格库!

相信大家对Matplotlib多少有些了解&#xff0c;对于数据研究&#xff0c;最终的研究结果都尽可能利用可视化呈现&#xff0c;使其更加直观通俗易懂。而Matplotlib作为python家族中最为著名的绘图工具&#xff0c;其风格实在是有些无聊&#xff0c;有时会让人觉得科研工作者在可…

React中的JSX应该怎么用

什么是JSX JSX Javascript XML&#xff0c;JSX是一个 JavaScript 的语法扩展。 JSX可以很好地描述 UI 应该呈现出它应有交互的本质形式并且其完全可以和JavaScript融合在一起使用。而且具有 JavaScript 的全部功能。JSX 可以生成 React “元素”。 JSX代码示例&#xff1a; …

MicroBlaze IP核中Local Memory Bus (LMB)接口描述

LMB&#xff08;Local Memory Bus&#xff09;是一种同步总线&#xff0c;主要用于访问FPGA上的块RAM&#xff08;Block RAM&#xff0c;BRAM&#xff09;。LMB使用最少的控制信号和一个简单的协议&#xff0c;以保证块RAM能在一个时钟周期内被存取。所有的LMB信号都是高电平有…

【服务器03】之【Navicat完整版破解】

首先清掉电脑所有Navicat组件 虽然被卸载掉了但是没有彻底清理掉Navicat组件 在原装盘里找到Navicat清楚碎片 清空之后开始下载 navicat16 https://www.alipan.com/s/GTvP93mn3sU 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需…

AI Workflow的敏捷开发:持续创新与优化的艺术

在人工智能的浪潮中&#xff0c;AI Workflow作为大模型落地的关键实践&#xff0c;正逐渐成为技术领域的新宠。然而&#xff0c;随着技术的发展&#xff0c;我们面临着一系列挑战&#xff0c;如何有效地应对这些挑战&#xff0c;实现AI Workflow的敏捷开发&#xff0c;成为了一…

fyne的VBox布局02

VBox布局02 最常用的布局是layout.BoxLayout&#xff0c;它有两种变体&#xff0c;水平和垂直。box布局将所有元素排列在单行或单列中&#xff0c;并带有可选的空格以帮助对齐。 一步一步实现一个如下界面布局&#xff0c;这个界面可以使用VBox布局来实现。 这次添加了2个复…

【C语言】自定义类型

目录 一、结构体&#xff1a; 1、结构体的声明&#xff1a; 2、结构体的自引用&#xff1a; 3、结构体变量的定义和初始化&#xff1a; 4、结构体内存对齐&#xff1a; 5、结构体传参&#xff1a; 6、位段&#xff1a; 二、枚举类型&#xff1a; 三、联合体&#xff1a…

【设计模式深度剖析】【10】【行为型】【状态模式】

&#x1f448;️上一篇:访问者模式 | 下一篇:解释器模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 状态模式定义英文定义直译如何理解呢&#xff1f; 状态模式的角色Context&#xff08;环境类&#xff09;State&#xff08;抽象状态类&#xff09;Concret…

Java | Leetcode Java题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; class Solution {public int majorityElement(int[] nums) {int count 0;Integer candidate null;for (int num : nums) {if (count 0) {candidate num;}count (num candidate) ? 1 : -1;}return candidate;} }

Netdata介绍

前言 Netdata是一款用于Linux系统的实时性能监测工具&#xff0c;它提供了web界面的视角&#xff0c;使得用户可以通过可视化的方式清晰地了解系统和应用程序的实时状态。 Netdata具有以下几个显著特点&#xff1a; 实时性&#xff1a;Netdata能够实时监测系统和应用程序的性…

Android-Android Studio-FAQ

1 需求 2 接口 3 Android Studio xml布局代码补全功能失效问题 最终解决方案就是尝试修改compileSdk 为不同SDK版本来解决问题&#xff0c;将原本34修改为32测试会发现xml代码补全功能有效了&#xff01; 参考资料 Android Studio xml布局代码补全功能失效问题_android studi…

电压调整+无功优化!考虑泄流效应的风电场并网点电压系统侧增援调控方法程序代码!

前言 在发电侧能源结构转型的背景下&#xff0c;中国在可再生能源发电技术上的快速发展使得电网中风电并网比例不断增大。风能资源的有效利用缓解了电力紧张&#xff0c;但由于风速的不确定性&#xff0c;风电场引起的公共耦合点&#xff08;point of common coupling&#xf…

vue3项目使用Electron打包成exe的方法与打包报错解决

将vue3项目打包成exe文件方法 一、安装 1.安装electron npm install electron --save-devnpm install electron-builder --save-dev 2.在vue项目根目录新建文件index.js // index.js// Modules to control application life and create native browser window const { app…

Map-JAVA面试常问

1.HashMap底层实现 底层实现在jdk1.7和jdk1.8是不一样的 jdk1.7采用数组加链表的方式实现 jdk1.8采用数组加链表或者红黑树实现 HashMap中每个元素称之为一个哈希桶(bucket),哈希桶包含的内容有以下4项 hash值&#xff08;哈希函数计算出来的值&#xff09; Key value next(…