1. 快速体验 VSCode 和 CMake 创建 C/C++项目

1. 快速体验 VSCode 和 CMake 创建 C/C++项目

本章的全部代码和markdown文件地址: CMake_Tutorial,欢迎互相交流.

此次介绍的内容都是针对于 Linux 操作系统上的开发过程.

1.1 安装开发工具

  1. VSCode: 自行下载安装, 然后安装插件

在这里插入图片描述

  1. Cmake:在 Ubuntu 系统上, 可以采用 apt 工具安装:sudo apt-get install cmake, 查看安装的版本cmake --version, 如下所示
pldz@pldz-pc:~/share/Temp/cmakeTest$ cmake --version
cmake version 3.16.3CMake suite maintained and supported by Kitware (kitware.com/cmake).
  1. 安装 GCC:例如采用命令行:sudo apt-get install gcc, 查看版本: gcc -v.

1.2 GCC/G++ 编译编译小型 C/C++项目

简单起两个文件,一个 mian.c 文件用于作为程序主入口,一个 hex.h 函数作为程序的一个外部头文件,简单实现将十进制的数转为十六进制的字符串

  1. 准备一个.h 文件,如 hex.h
#include <stdlib.h>
#include <stdio.h>char *int2hex(int decimal)
{// 1. 静态变量来存储结果,否则函数返回时,局部数组的内存会被释放.static char hex[10];// 2. 也可以采用动态的内存.// char *hex = (char *)malloc(10 * sizeof(char));// if (hex == NULL)// {//     printf("Failed to allocate memory\n");//     exit(1);// }sprintf(hex, "%x", decimal);return hex;
}
  1. 准备的 main.c 文件:
#include <math.h>
#include "hex.h"int main()
{// 1. 测试十进制和十六进制int decimal;char *hex;printf("Enter a decimal number: ");scanf("%d", &decimal);hex = int2hex(decimal);printf("Hexadecimal: %s\n", hex);int d = sqrt(decimal);// 测试math.h的引入动态库,sqrt参数实际上是double类型的,这里使用int类型也是可以的.printf("Sqrt value is: %lf\n", sqrt(decimal));return 0;
}
  1. 直接采用 gcc 编译:gcc main.c -lm -o test, 或者是gcc main.c hex.h -lm -o test

在这里插入图片描述

  1. 做个总结:
    1. GCC 编译器的起始入口是 main 函数, 它会找到 main 函数的入口, 然后再当前目录下找它依赖的头文件.
    1. 在编译时,如果需要链接动态库,-lm需要拆开理解,其中 -l 参数指定需要链接的库, m 表示数学库 libm.so.
    1. gcc 命令中的 -o 后面的参数表示生成的可执行文件的名称,-o同样也可以生成动态库.
    • 创建一个 hex.c 文件,里面声明 hex.h 的函数,但是不使用:
#include "hex.h"char *int2hex(int decimal);
  • 编译成动态库: gcc hex.c hex.h -Wall -fPIC -shared -o test.so, 即可生成 so 动态库,其中的 -Wall 参数表示开启所有警告信息,编译器会显示所有可能的警告, -fPIC 参数表示生成位置无关代码,这是为了生成共享库(.so文件)必需的, -shared 参数指定生成共享库(.so 文件)而不是可执行文件.

  • 查看动态库的函数命令 nm -D <动态库名称>nm -D test.so

pldz@pldz-pc:~/share/Temp/cmakeTest/simpleGCC$ nm -D test.sow __cxa_finalizew __gmon_start__
00000000000011b9 T int2hexU __isoc99_scanfw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable
00000000000011ee T mainU printfU sprintfU sqrtU __stack_chk_fail

1.3 CMake 编译 C/C++程序流程

C/C++教材经常提到的 C 代码的实现过程, 就是从源码 .c 然后经过编译生成 .obj 文件, 然后再链接生成可执行的文件 .exe.
CMake 的操作流程也是类似,只不过,需要初始化为 CMake 工程, 然后 1.项目源码 -> 2.CMakeLists.txt-> 3.执行cmake命令 -> 4.生成Makefile -> 5.make指令-> 6.生成执行文件

在这里插入图片描述

  1. 创建CMakeLists.txt文件.

  2. 写入以下内容到CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.0)
project(TEST)add_executable(test main.c hex.h)
target_link_libraries(test m)

注意,在老版本的 CMake 工具上,如果目标文件是 test,可能会提示是无效的

CMake Error at CMakeLists.txt:4 (add_executable):
The target name "test" is reserved or not valid for certain CMake features,
such as generator expressions, and may result in undefined behavior.

此时可以把目标文件的名称从test 改为my_test

此时的文件结构:

pldz@pldz-pc:~/share/Temp/cmakeTest/simpleGCC$ tree
.
├── CMakeLists.txt
├── hex.h
└── main.c
  1. 执行cmake .指令,创建出Makefile.

在这里插入图片描述

  1. 执行make指令,生成可执行文件test

在这里插入图片描述

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

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

相关文章

Ae 效果:CC Hair

模拟/CC Hair Simulation/CC Hair CC Hair&#xff08;CC 毛发&#xff09;可以在源图像上模拟生成毛发、绒线等&#xff0c;并可调整它们的长度、方向、重量等属性&#xff0c;从而创建出非常独特的效果。 CC Hair 本质上是基于 Alpha 通道来生成毛发&#xff0c;无毛发处将变…

Debian 12安装Docker

1.更新系统包 #apt update 2.安装依赖包 #apt install apt-transport-https ca-certificates curl gnupg lsb-release 3.添加Docker源 &#xff08;1&#xff09;添加Docker 官方GPG密钥 #curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/s…

GraphQL基础知识与Spring for GraphQL使用教程

文章目录 1、数据类型1.1、标量类型1.2. 高级数据类型 基本操作2、Spring for GraphQL实例2.1、项目目录2.2、数据库表2.3、GraphQL的schema.graphql2.4、Java代码 3、运行效果3.1、添加用户3.2、添加日志3.3、查询所有日志3.4、查询指定用户日志3.5、数据订阅 4、总结 GraphQL…

基于LUT查找表方法的图像gamma校正算法FPGA实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将gamma2.2和gamma1/2.2的数据分别导入到matlab进行对比&#xff1a; 2.算法运行软件版本 matlab2022a 3.部分核心程序 timescale 1ns / 1ps //…

C2基础设施威胁情报对抗策略

威胁情报是指在信息安全和安全防御领域&#xff0c;收集、分析和解释与潜在威胁相关的信息&#xff0c;以便预先发现并评估可能对组织资产造成损害的潜在威胁&#xff0c;是一种多维度、综合性的方法&#xff0c;其通过信息的收集、分析和研判&#xff0c;帮助组织了解可能对其…

Vue.js vs React:哪一个更适合你的项目?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

小谈设计模式(2)—简单工厂模式

小谈设计模式&#xff08;2&#xff09;—简单工厂模式 专栏介绍专栏地址专栏介绍 简单工厂模式简单工厂模式组成抽象产品&#xff08;Abstract Product&#xff09;具体产品&#xff08;Concrete Product&#xff09;简单工厂&#xff08;Simple Factory&#xff09;三者关系 …

【MySQL】MySQL索引的定义、分类、Explain、索引失效和优化

索引的介绍 索引是帮助MySQL高效获取数据的数据结构 MySQL在存储数据之外&#xff0c;数据库系统中还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用(指向)表中的数据&#xff0c;这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数…

JSP 学习笔记(基础)

出现背景&#xff1a; 由于 Servlet 输出 HTML 比较困难&#xff0c;所以出现了 JSP 这个代替品。 特点&#xff1a; 基于文本&#xff0c;HTML 和 Java 代码共同存在&#xff08;用 write() 来写 HTML 标签&#xff09;其本身就是个被封装后的 Servlet&#xff08;被编译为…

springboot对接postgres

安装postgres 注意:下述链接方式会自动创建数据库steven_russell,若需要创建其他数据库&#xff0c;可以手动执行命令创建数据库 docker run --name postgres \ -p 5432:5432 \ -e POSTGRES_USERsteven_russell \ -e POSTGRES_PASSWORD123456 \ -itd --privilegedtrue postgre…

D数树,牛客小白月赛78,思维

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 “开导&#xff01;” 众所周知&#…

BGP路由属性

任何一条BGP路由都拥有多个路径属性&#xff08;Path Attributes&#xff09;&#xff0c;当路由器通告BGP路由给它的对等体时&#xff0c;该路由将会携带多个路径属性&#xff0c;这些属性描述了BGP路由的各项特征&#xff0c;同时在某些场景下也会影响BGP路由优选的决策。 一…

【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案

1、背景: 在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下 FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18 而数据库中原始数据如下,并没有到下午5点…

01.qtcreator介绍

四、创建第一个qtcreator项目并确定文件和目录的作用 bin: 存放编译好输出的dll文件和执行文件 doc: 存放文档 lib: 存放库文件 src: 存放源码 注意&#xff1a; QtCreator创建路径不要使用中文路径&#xff1b;创建.h和.cpp文件时&#xff0c;使用小写&#xff1b;windows大…

解读|美创深度参与5项电信和互联网行业数据安全标准发布实施

《数据安全法》、《个人信息保护法》等法律法规的颁布实施&#xff0c;坚持安全和发展并重的原则&#xff0c;积极应对复杂严峻的安全风险与挑战&#xff0c;加速构建数据安全保障体系&#xff0c;成为电信和互联网行业重要工作。 “安全发展、标准先行”&#xff0c;标准化工作…

一文详解TCP三次握手四次挥手

文章目录 TCP的三次握手和四次挥手三次握手四次挥手 TCP的三次握手和四次挥手 基本概念 SYN&#xff08;Synchronize Sequence Numbers&#xff0c;同步序列数字&#xff09;&#xff1a;用于建立连接的同步信号。 SYN 序列号的作用是用于标识每个数据包中的字节流的起始位置。…

线上论坛之单元测试

对线上论坛进行单元测试的测试报告 源码地址&#xff1a;https://gitee.com/coisini-thirty-three/forum 一、用户部分&#xff08;UserServiceImplTest&#xff09; 1.创建普通用户 测试名称 createNormalUser() 测试源码 Test void createNormalUser() { // 构造用户 User …

指针和数组笔试题解析

大家好&#xff0c;我们今天来学习有关于指针和数组的笔试题解析。 在之前的C语言学习中我们知道了数组名代表的是数组首元素的地址&#xff0c;而有两个例外&#xff0c;就是sizeof中和&符操作取的就是整个数组的地址&#xff0c;那么我们今天的学习重点就是这些关于数组…

哈希(hash)——【C++实现】

本章gitee代码仓库&#xff1a;Hash 文章目录 &#x1f490;1. 哈希概念&#x1f33b;2. 哈希冲突&#x1f33c;3. 哈希函数&#x1f338;3.1 哈希函数设计原则&#x1f338;3.2 常见哈希函数 &#x1fab4;4. 哈希冲突解决方案&#x1f331;4.1 闭散列——开放定址法&#x1f…

【ROS】Ubuntu20.04+ROS Noetic 配置PX4-v1.12.2和Gazebo11联合仿真环境【教程】

【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】 文章目录 【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】0. 安装UbuntuROS1. 安装依赖2. 安装QGC地面站3. 配置PX4-v1.12.23.1 安装PX43.2 测试PX4是否成功安装…