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

2023-09-18 00:28:13

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.3

CMake 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.so
                 w __cxa_finalize
                 w __gmon_start__
00000000000011b9 T int2hex
                 U __isoc99_scanf
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
00000000000011ee T main
                 U printf
                 U sprintf
                 U sqrt
                 U __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

在这里插入图片描述

更多推荐

怎么压缩ppt大小?快速压缩ppt文件

怎么压缩ppt大小?在工作或生活中,ppt文件对于我们必不可少,我们用它编写工作总结或者会议提纲,非常的好用,深受大家的喜欢。由于使用比较频繁,所以常常会遇到PPT文件过大的情况,ppt文件太大使用起来会造成很大的不便,这时候就需要对ppt文进行压缩,压缩的目的就是将它的体积变小一点。然而,许多人并不清楚如何缩小PPT

海外ASO优化之提高应用曝光度的技巧1

作为应用程序的开发者,如何使我们的应用在众多竞争对手中脱颖而出?如何应用在AppStore搜索中排名更高,以确保它符合AppStore搜索中的搜索意图?这些都是我们要重点考虑的。1、做好应用程序描述。在填写应用描述之前,需要了解我们的应用有哪些特点和功能,或者是能够给用户解决哪些问题。此外我们还可以添加一些具有创意的屏

网络地址转换技术NAT以及路由器LAN口与WAN口的数据交换

NAT技术网络地址转换(NAT)技术可以帮助局域网设备通过私有IP地址访问互联网。以下是NAT技术如何实现这一功能的基本原理:私有IP地址:在一个局域网中,通常使用私有IP地址来为设备分配网络标识。私有IP地址范围包括以下几个常见的子网,如10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。

Leetcode 01-算法入门与数组-②数组基础

LeetCode01-算法入门与数组-②数组基础一.数组基础知识1.数组简介1.1数组定义数组(Array):一种线性表数据结构。它使用一组连续的内存空间,来存储一组具有相同类型的数据。简单来说,「数组」是实现线性表的顺序结构存储的基础。以整数数组为例,数组的存储方式如下图所示。如上图所示,假设数据元素的个数为nnn,

结构型模式-代理模式

一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。意图:为其他对象提供一种代理以控制对这个对象的访问。主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某

2023年8月京东平板电视行业品牌销售排行榜(京东商品数据)

鲸参谋监测的京东平台8月份平板电视市场销售数据已出炉!根据鲸参谋电商数据分析平台的相关数据显示,8月份,京东平台上平板电视的销量为76万,环比下滑约12%,同比下滑约36%;销售额为20亿+,环比下滑约10%,同比下滑约20%。从销量销额来看,平板电视市场当月整体呈现下滑趋势。但从价格角度来看,平板电视的市场均价上涨,

形式化验证方法研究综述

摘要:形式化验证是证明软件、硬件或系统正确性的一种方法,近年来受到了越来越多的关注。本文对形式化验证的研究进行了综述。首先介绍了形式化验证的基本概念,然后重点介绍了形式化验证的三种技术,包括模型检测、定理证明和等价性验证等。此外,通过两篇论文介绍了形式化验证在软件和硬件系统开发中的应用和实现、形式化验证工具的发展和使用

chk文件怎么恢复?chk文件恢复软件哪个好?

电脑中的每个文件都有其不同的后缀名,如.txt、.png等等,那么你知道.chk后缀的文件是什么吗?下面我们就来一起了解一下吧。chk文件的含义chk文件是用户在使用磁盘碎片整理程序后所产生的丢失簇的恢复文件,磁盘中的原文件并没有丢失,而是变成了chk文件,并被存放在FOUND.000文件夹中。另外,移动存储设备在使用

2023年海南省职业院校技能大赛(高职组)应用软件系统开发赛项规程

2023年海南省职业院校技能大赛(高职组)应用软件系统开发赛项规程赛项名称赛项名称:应用软件系统开发英文名称:ApplicationsoftwareDevelopment赛项组别:高职组赛项归属产业:电子信息专业类竞赛目标本赛项以应用软件开发技术为核心、考察应用软件开发人员的专业技能、职业素养和企业化全流程开发的能力。

linux 数据恢复

Linux误删除及误格式化的数据恢复方案针对的文件系统:1、基于EXT2/EXT3/EXT4文件系统;2、基于Reiserfs文件系统;3、基于Xfs文件系统。Linux误删除及误格式化的数据恢复解决方案:一、故障检测:1、检测是否存在硬件故障,如有硬件故障先处理硬件问题。2、以只读方式检测故障表现是否与用户的描述相同

动态规划之子序列

子序列问题1.最长递增子序列2.摆动序列3.最长递增子序列的个数4.最长等差数列5.等差数列划分II-子序列首先说明一下子序列和子数组的概念。在数组中,子数组是由连续的元素组成的,而子序列则不一定是连续的。在字符串中,子串是由连续的字符组成的,而子序列则不一定是连续的。1.最长递增子序列1.题目链接:子序列问题2.题目

热文推荐