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.hqwc.cn/news/112405.html

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

相关文章

浅析三维模型3DTile格式轻量化处理常见问题与处理措施

浅析三维模型3DTile格式轻量化处理常见问题与处理措施 三维模型3DTile格式的轻量化处理是大规模三维地理空间数据可视化的关键环节&#xff0c;但在实际操作过程中&#xff0c;往往会遇到一些问题。下面我们来看一下这些常见的问题以及对应的处理措施。 变形过大&#xff1a;压…

阿里云无影云电脑和传统PC有什么区别?

阿里云无影云电脑和传统电脑PC有什么区别&#xff1f;区别大了&#xff0c;无影云电脑是云端的桌面服务&#xff0c;传统PC是本地的硬件计算机&#xff0c;无影云电脑的数据是保存在云端&#xff0c;本地传统PC的数据是保存在本地客户端&#xff0c;阿里云百科分享阿里云无影云…

基于AR增强现实模拟离心泵结构拆装与运行

通过AR模拟&#xff0c;学生可以虚拟地观察离心泵的结构和部件&#xff0c;进行拆装、安装和调试的操作&#xff0c;而无需实际接触物理设备。这极大地降低了学生操作过程中的风险。 AR模拟离心泵的拆装过程可以分为几个步骤。首先&#xff0c;学生选择相应的模拟程序&#xff…

git 查看当前版本号

你看&#xff0c;那个人好像一条狗哎。 ——周星驰 《大话西游》 要查看当前 Git 仓库的版本号&#xff0c;您可以使用以下命令&#xff1a; git log --oneline -n 1 这会显示最近一次的提交信息&#xff0c;包括提交的哈希值&#xff08;版本号&#xff09;和提交的摘要信息…

2023/9/17总结

Vue defineOptions 为什么要使用defineOptions 在有<script setup> 之前 如果需要定义props emit 可以很容易的添加一个与setup 平级的属性 但是用了 <script setup> 后 就不能这样做了 setup 属性也就没有了&#xff0c;就不能添加 与其平级 的属性 为了解…

Linux(下)

一、 对netstat的补充 1.进程管理 在杀死进程时&#xff0c;不可以杀死其他用户的进程。 查看指定进程时&#xff0c;下图的第二行 是ps -ef | grep tail 命令执行的进程 kill -9 进程号 也可以写作 kill -s 9 进程号 机器人&#xff1a; 2.查看主机状态 2.1 top命令&…

Git 基本操作【本地仓库与远程仓库的推送、克隆和拉取】

文章目录 一、Git简介二、Git的下载安装三、Git常规命令四、新建本地仓库五、本地分支操作六、Git远程仓库七、远程仓库克隆、抓取和拉取八、总结九、学习交流 一、Git简介 Git是分布式版本控制系统&#xff08;Distributed Version Control System&#xff0c;简称 DVCS&…

智能AI写作系统+ChatGPT程序源码搭建部署教程+支持GPT4.0/AI绘画

一、SparkAI智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文…

驱动开发,udev机制创建设备节点的过程分析

1.创建设备文件的机制种类 mknod命令&#xff1a;手动创建设备节点的命令 devfs:可以用于创建设备节点&#xff0c;创建设备节点的逻辑在内核空间&#xff08;内核2.4版本之前使用&#xff09; udev:自动创建设备节点的机制&#xff0c;创建设备节点的逻辑在用户空间&#xf…

基于Java+SpringBoot+Vue的旧物置换网站设计和实现

基于JavaSpringBootVue的旧物置换网站设计和实现 源码传送入口前言主要技术系统设计功能截图数据库设计代码论文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 摘 要 随着时代在一步一步在进步&#xff0c;旧物也成人们的烦恼&#xff0c;…

一键畅享云端ERP:使用Cpolar内网穿透将用友U8 Cloud部署至外网

文章目录 前言1. 用户需求2. Cpolar内网穿透的安装和注册2.1 Cpolar云端设置2.2 Cpolar Web UI本地设置 3. 公网访问测试 前言 用友U8 Cloud是用友公司推出的一款云端ERP解决方案。它以云计算技术为基础&#xff0c;为企业提供全面的企业资源管理解决方案&#xff0c;涵盖了财…

github 上传和拉取 support for passward authentication was removed...

参考下面这篇文章 remote: Support for password authentication was removed on August 13, 2021_IT博客技术分享的博客-CSDN博客 但是记得把repositories和 permissions的选项都点上&#xff0c;不然又会报下面的错误。