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

网上做平面设计的网站/世界大学排名

网上做平面设计的网站,世界大学排名,旅游最好的网站建设,有哪些网站可以做全景效果图最近项目需求,需要在Linux下开发C相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项。 关于VS Code在Linux下的安装这里就不提了,不管是CentOS还是Ubuntu,如果不懂且搜Q足够的情况下&a…

最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项。

关于VS Code在Linux下的安装这里就不提了,不管是CentOS还是Ubuntu,如果不懂且搜Q足够的情况下,你会解决的。

一. 前置知识——gcc/g++的编译链接过程

在Windows下,如果你用Visual Studio进行开发,C/C++的编译器一般采用微软提供的MSBuild;在Linux下C/C++的编译器大多采用gcc/g++。既然要在Linux下进行C++开发,很有必要了解一下g++编译器的一些基本知识。

假设我现在有一个最简单的C++文件:

#include <iostream>
using namespace std;
int main() {cout << "Hello, world!!!!" << endl;return 0;
}

接下来如何编译呢?简单来说分成两步:先编译,再链接

1. 安装g++编译器

启动终端,进入root模式,安装gcc和g++

Ubuntu:

> sudo apt-get install build-essential<br><br>xxx@xxx:~$ gcc --version
> sudo apt-get install g++-4.8
> g++ --version

CentOS:

> su
> yum install gcc
> gcc --version
> yum install gcc-g++
> g++ --version

2. 编译hello.cpp

> g++ -c hello.cpp

输出结果是一个hello.o文件,这是编译过程的生成的中间文件。-c 表示只编译,不链接。

3. 链接hello.o生成hello.out

g++ -o hello.out hello.o

输出结果是一个hello.out文件,这是最终的可执行文件。-o 表示输出文件,hello.o是上一步生成的.o文件。

当然,如果第2、3步是可以合并执行,直接执行命令

g++ -o hello.out hello.cpp

然而第2、3步分开执行是有意义的,后面会讲到。

4. 运行hello.out

最后执行以下hello.out验证一下输出结果呗

./hello.out

二. 构建项目

实际开发过程中当然不可能只有一个cpp这么简单,有时候会有非常多的.h和.cpp文件相互配合,那么上面直接通过g++编译可执行文件就没那么简单了。我们需要借助Make这个强大的项目构建工具,帮助我们构建和组织项目代码。

假设现在有如下3个文件:hw2.cpp、solution.h和solution.cpp

/* solution.h */
class Solution {
public:void Say();
};/* solution.cpp */
#include <iostream>
#include "solution.h"
void Solution::Say(){std::cout << "HI!" << std::endl;
}/* hw2.cpp */
#include "solution.h"
int main () {Solution sln;sln.Say();return 0;
}

可以看到这个简单例子包括头文件引用、定义和实现分离等情况,如果直接g++ -o hw2.out hw2.cpp将会报未定义引用的错误:

> g++ -o hw2.out hw2.cpp 
/tmp/ccIMYTxf.o:在函数‘main’中:
hw2.cpp:(.text+0x10):对‘Solution::Say()’未定义的引用
collect2: 错误:ld 返回 1

这时Make就该大显身手了。

首先我们还需要了解一下makefile。

在项目的根目录下创建一个makefile文件,以告诉Make如何编译和链接程序。

build : hw2.o solution.og++ -o build hw2.o solution.o #注意前面必须是tab,不能是空格
hw2.o : hw2.cpp solution.hg++ -g -c hw2.cpp
solution.o : solution.h solution.cppg++ -g -c solution.cpp
clean :rm hw2.o solution.o build

先来解释一下makefile的基本语法规则:

target ... : prerequisites ...command    #注意前面是tab

target是一个目标文件,可以是Object File,也可以是执行文件,还可以是一个标签;

prerequisites是要生成那个target所需要的文件或是目标;

command是make需要执行的命令(任意的Shell命令)。

说白了就是target这一个或多个目标,依赖于prerequisites列表中的文件,其执行规则定义在command里。如果prerequisites列表中文件比target要新,就会执行command,否则就跳过。这就是整个make过程的基本原理。

那么,我们回头看看上面定义的makefile文件,我们解释一下每两行的作用

build : hw2.o solution.og++ -o build hw2.o solution.o

target是build,依赖于hw2.o 和 solution.o,执行的命令是 g++ -o build hw2.o solution.o

意思是通过g++链接hw2.o和solution.o,生成可执行文件build,prerequisites有两个.o文件,是因为代码里hw2引用了solution.h。

hw2.o : hw2.cpp solution.hg++ -g -c hw2.cpp

target是hw2.o,依赖于hw2.cpp和solution.h,执行命令是g++ -g -c hw2.cpp

意思是通过g++编译hw2.cpp文件,生成hw2.o文件,g++命令中 -g 表示生成的文件是可调试的,如果没有-g,调试时无法命中断点。

solution.o : solution.h solution.cppg++ -g -c solution.cpp

同上,编译solution.cpp文件,生成solution.o文件。

clean :rm hw2.o solution.o build

这里clean不是一个可执行文件,也不是一个.o文件,它只不过是一个动作名字,类似于label的作用,make不会去找冒号后的依赖关系,也不会自动执行命令。如果要执行该命令,必须在make后显示指出整个动作的名字,如make clean。

好了,接下来说一下make的工作原理。在默认的方式下,我们只需输入make,则发生了以下行为:

a. make在当前目录下找名为makefile或Makefile的文件;

b. 如果找到,它会找文件中的第一个target,如上述文件中的build,并作为终极目标文件;

c. 如果第一个target的文件不存在,或其依赖的.o 文件修改时间要比target这个文件新,则会执行紧接着的command来生成这个target文件;

d. 如果第一个target所依赖的.o文件不存在,则会在makefile文件中找target为.o的依赖,如果找到则执行command,.o的依赖必是.h或.cpp,于是make可以生成 .o 文件了

e. 回溯到b步执行最终目标

看一下执行结果:

> make
g++ -g -c hw2.cpp
g++ -g -c solution.cpp
g++ -o build hw2.o solution.o #注意前面必须是tab,不能是空格
> ./build <br><em>HI!<br></em>[xxx@xxx ~]$

由于makefile文件中加了-g这一选项,于是可以通过gdb进行调试,并且会命中断点,这里感兴趣可以再了解一下gdb的使用。

接下来我们要说到如何通过VS Code进行调试。

三. 在VS Code中编译调试

首先安装完VS Code之后,还需要安装一下扩展cpptools,请自行完成。

在这里插入图片描述
点击菜单 查看-> 调试,或直接快捷键ctrl + shift + D

在这里插入图片描述

点击设置图标,在弹出的选择环境中选择C++(GDB/LLDB),会自动创建一个launch.json文件

在这里插入图片描述

顾名思义,laucn.json的作用是告诉VS Code如何执行启动任务,也就是我们要把什么文件启动起来,在上述例子中显然是build这个可执行文件了。修改一下json文件中波浪线的program节点,改成**${workspaceRoot}/build**,其余的暂时不变

{"version": "0.2.0","configurations": [{"name": "C++ Launch","type": "cppdbg","request": "launch","program": "${workspaceRoot}/build","args": [],"stopAtEntry": false,"cwd": "${workspaceRoot}","environment": [],"externalConsole": true,"linux": {"MIMode": "gdb"},"osx": {"MIMode": "lldb"},"windows": {"MIMode": "gdb"}},{"name": "C++ Attach","type": "cppdbg","request": "attach","program": "${workspaceRoot}/build","processId": "${command.pickProcess}","linux": {"MIMode": "gdb"},"osx": {"MIMode": "lldb"},"windows": {"MIMode": "gdb"}}]
}

接着我们尝试一下F5,开始调试,结果可以看到报了一个缺少build文件的错误。原因是我们还没执行make编译出可执行文件呢。我们在launch.json文件中,添加一个preLaunchTask的节点,并设置值为“build”。注意这里的build不是指可执行文件build,而是一个名为build的任务!

{"version": "0.2.0","configurations": [{"name": "C++ Launch","type": "cppdbg","request": "launch","program": "${workspaceRoot}/build","args": [],"stopAtEntry": false,"cwd": "${workspaceRoot}","environment": [],"externalConsole": true,"preLaunchTask": "build","linux": {"MIMode": "gdb"},"osx": {"MIMode": "lldb"},"windows": {"MIMode": "gdb"}},{"name": "C++ Attach","type": "cppdbg","request": "attach","program": "${workspaceRoot}/build","processId": "${command.pickProcess}","linux": {"MIMode": "gdb"},"osx": {"MIMode": "lldb"},"windows": {"MIMode": "gdb"}}]
}

再尝试F5,会提示一个信息:
在这里插入图片描述

点击配置任务运行程序,并选择Others, 会自动生成一个tasks.json文件,这个文件的作用就是告诉launch或者编译器需要执行什么操作。显然我们这里要执行make命令,修改tasks.json为如下:

{"version": "0.1.0","command": "make","showOutput": "always","tasks": [{"taskName": "clean"},{"taskName": "build","problemMatcher": {"owner": "cpp","fileLocation":  ["relative", "${workspaceRoot}"],"pattern": {"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$","file": 1,"line": 2,"column": 3,"severity": 4,"message": 5}}}]
}

其中tasks节点是一组任务,注意到其中一个名为build的任务,这就是launch.json文件中指定的preLaunchTask,表明在启动可执行程序之前,会先执行一下preLaunchTask即这里的build任务,重新make一下代码,更新可执行程序之后再启动。

当然也可以指运行tasks这些任务而不启动可执行程序,直接ctrl + shift + B,在VSC的console里可以看到和终端执行一样的输出:

在这里插入图片描述

执行完后,项目中会多出.o和build文件

在这里插入图片描述

关于VS Code的launch.json和tasks.json中更多节点的含义,参考

https://code.visualstudio.com/docs/editor/debugging

https://code.visualstudio.com/docs/editor/tasks

接着设置好断点之后F5,就可以进入断点调试了

在这里插入图片描述


本篇总结了gcc/g++和make/makefile的基础知识,以及在Linux下使用VS Code进行调试开发的方法,希望对正在挖坑的同学有所帮助,坑避免一个是一个。

http://www.lbrq.cn/news/1357741.html

相关文章:

  • 怎样做企业网站建设/班级优化大师下载安装最新版
  • 网站开发所需要注意的问题/百度灰色词排名代发
  • 响应式网站建设代理商/宁波seo外包代运营
  • 优享揭阳网站建设/宁德市公共资源交易中心
  • dede如何手机网站和电脑网站的数据同步更新/优化网哪个牌子好
  • 公明网站建设/免费推广网站地址大全
  • 绍兴做公司网站的公司/专业软文代写
  • 燕莎做网站/seo的基础优化
  • 高唐企业做网站推广/神起网络游戏推广平台
  • 现在做网站有前途吗/山东泰安网络推广
  • 如何自己做免费网站/seo工具
  • 垂直行业门户网站/品牌维护
  • 网盘搜索网站 怎么做/外贸推广平台怎么做
  • 黑龙江省机场建设集团官网网站/进入百度首页官网
  • 自力教育/大连seo建站
  • wordpress图片放大/武汉网站优化公司
  • 做网站的dreamweaver/百度指数分析案例
  • 做网站需要哪些东西/东莞网站建设推广品众
  • 下载手机软件的app/武汉seo技术
  • 展示型网站建设价格/怎么推广一个网站
  • 网站怎么做cp备案号/一个完整的产品运营方案
  • 做传感器交易的网站/如何在网站上推广自己的产品
  • 建筑工地网站有哪些/购买链接怎么买
  • 不同的网站 做301/网页设计排版布局技巧
  • 建设商务公司网站/大作设计网站
  • 揭阳 网站建设/视频号怎么推广流量
  • 怎么建网站手机版/北京seo顾问外包
  • 廊坊市做网站/什么是营销渠道
  • 做网站数据库怎么整/西安网站建设维护
  • 网站开发个人简介范文/域名解析ip
  • Leetcode题解:739每日温度,用单调栈解决问题!
  • Dart中回调函数的简单实现
  • 【Linux】调试器gdb/cgdb的使用
  • 多传感器融合
  • 力扣148:排序链表
  • 【STM32】HAL库中的实现(四):RTC (实时时钟)