• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > Linux中使用VS Code编译调试C++项目详解

Linux中使用VS Code编译调试C++项目详解

作者:DoubleLi 字体:[增加 减小] 来源:互联网 时间:2017-05-28

DoubleLi 通过本文主要向大家介绍了code blocks linux,vs code linux,the code linux,code linux,linux c++编译器等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言

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

一、前置知识——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;
 }
</div>

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

1. 安装g++编译器

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

Ubuntu:

CentOS:

[xxx@xxx ~]$ su
[xxx@xxx ~]# yum install gcc
[xxx@xxx ~]# gcc --version
[xxx@xxx ~]# yum install gcc-g++
[xxx@xxx ~]# g++ --version
</div>

2. 编译hello.cpp

[xxx@xxx ~]$ g++ -c hello.cpp
</div>

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

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

[xxx@xxx ~]$ g++ -o hello.out hello.o
</div>

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

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

[xxx@xxx ~]$ g++ -o hello.out hello.cpp
</div>

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

4. 运行hello.out

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

[xxx@xxx ~]$ ./hello.out
</div>

二、构建项目

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

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

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

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

[xxx@xxx ~]$ 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.o
 g++ -o build hw2.o solution.o #注意前面必须是tab,不能是空格
 hw2.o : hw2.cpp solution.h
 g++ -g -c hw2.cpp
 solution.o : solution.h solution.cpp
 g++ -g -c solution.cpp
 clean :
 rm hw2.o solution.o build
</div>

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

target ... : prerequisites ...
  command #注意前面是tab
</div>

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

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

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

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

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

 build : hw2.o solution.o
 g++ -o build hw2.o solution.o
</div>

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.h
 g++ -g -c hw2.cpp
</div>

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.cpp
 g++ -g -c solution.cpp
</div>

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

clean :
 rm hw2.o solution.o build
</div>

这里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步执行最终目标

看一下执行结果

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

由于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,其余的暂时不变

1 {
 2  "version": "0.2.0",
 3  "configurations": [
 4   {
 5    "name": "C++ Launch",
 6    "type": "cppdbg",
 7    "request": "launch",
 8    "program": "${workspaceRoot}/build",
 9    "args": [],
10    "stopAtEntry": false,
11    "cwd": "${workspaceR



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Linux中使用VS Code编译调试C++项目详解

相关文章

  • 2017-08-17C++构造函数和析构函数的调用顺序
  • 2017-05-28C语言基础之malloc和free函数详解
  • 2017-05-28获取本地网卡适配器信息具体代码
  • 2017-05-28C++ ofstream与ifstream详细用法
  • 2017-05-28如何在C语言的宏中使用类型关键字
  • 2017-05-28C++ 中"emplace_back" 与 "push_back" 的区别
  • 2017-05-28浅谈c和c++的某些小区别
  • 2017-05-28C 语言插入排序算法及实例代码
  • 2017-05-28C++中构造函数重载
  • 2017-05-28C语言查找数组里数字重复次数的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入理解卡特兰数及其应用
    • C++回文数及素数问题计算方法
    • C++类的静态成员初始化详细讲解
    • C++如何通过ostringstream实现任意类型转string
    • c语言求阶乘精确值示例
    • C++中CSTRINGLIST用法详解
    • C++聚合关系类的构造函数的调用顺序详解
    • 文件编译时出现multiple definition of 'xxxxxx'的具体解决方法
    • C语言 存储类详解及示例代码
    • 基于C语言实现简单的走迷宫游戏

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有