这几天因为任务的原因我需要在ubuntu下编写程序。因此恶补了许多linux程序编写的知识。我分以下几个方面总结我所学的知识。

  1. gcc,g++,make命令的使用
  2. gdb 调试
  3. VScode的使用
  4. cmake使用

gcc,g++,make命令的使用

从大学接触程序设计开始就一直依赖IDE,使用了VC6.0,Visual Studio 2010,Pycharm,eclipse。但是从来不清楚这些文件是如何转换成计算机可运行的程序。在Linux环境中这些事情都要由程序员来处理,让我对程序编译的过程更加的清楚。

对于C++程序(C也是类似的,只是相应的g++命令要换成gcc命令),我们假设有一个main.cpp文件,这个程序含有main函数且不依赖其它的文件。编译命令

g++ main.cpp -o main

-o的目的是为生成的可执行文件添加文件名,如果没有这个生成的可执行文件名为a.out。

现在假设有三个文件main.cpp, class1.h, class1.cpp。其中main.cpp是主函数,使用类class1生成对象,也包含了class1的头文件(#include"class1.h")。如果存在调用其它文件,直接使用g++是不可行的。因为g++会连续执行编译链接,应该先对每个文件编译成目标文件(.o)再链接起来,命令是

g++ -c main.cpp -o main.o
g++ -c class1.cpp -o class1.o
g++ main.o class.o -o main

这种方法对C文件只是把g++换成gcc。可是对于频繁编译的场景,每次都输入这些命令太累了,所以就有了make命令。make命令可以编译一个文件,但是要舍去文件后缀名,例如编译无依赖的main.cpp,命令:

make main

对于有依赖的项目要编写Makefile文件。这个文件没有后缀名,文件名就是Makefile。我们把这个文件放在项目的根目录下,在根目录的命令行下输入make就可以编译了。现在我们看看这个文件怎么制作:

main : main.o class1.o
gcc main.o class1.o -o main
main.o : main.cpp
gcc -c main.cpp -o main.o
class1.o : class1.cpp
gcc -c class1.cpp -o class1.o
clean:
rm -i *.o main

第一句说明了文件依赖关系,main可执行文件需要main.o, class1.o才能生成,接着回车换行加一个制表符后是编译main的命令行。注意makefile文件的编写和实际的编译过程是相反的。

gdb调试

理解了文件的编译过程我们还要明白程序在linux环境下是如何用命令行调试的。

如果一个程序需要调试,那么编译时需要将源代码也编译进程序中。我们以无依赖的main.cpp为例:

g++ main.cpp -o main -g

注意后面要加-g,否则不能调试。我们输入命令:gdb main进入gdb的环境中,命令行会出现

hchen/test> gdb tst  <---------- 启动GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-suse-linux"...
(gdb)

我们可以使用以下命令调试

命令 功能
b 设置断点,例:b 12在第12行设置断点,b main在main函数第一句设断点
s 逐条执行,进入函数
n 单条语句执行,不进入函数
d 清除断点,d 1清楚1号断点,d清楚所有断点
r 开始运行程序
q 离开gdb环境
finish 从当前函数中跳出
p 显示数值,p sum显示sum变量的值
c 继续执行

其实IDE就是对这些命令的封装,但我们不应该忘记程序是怎么从代码生成的。

VScode的使用

有了命令行编译和调试的经验,VScode就方便理解了。因为VScode没有Visual Studio那么傻瓜,编译和调试过程必须通过json文件来设置,其中必须要和g++,gcc,make,gdk命令打交道。这里不细讲这个过程,有兴趣可以看在linux中使用VS code编译C++项目。这里我讲一下自己在学习中遇到的错误。

首先VScode是一个项目对应一个工作目录。这一点和pycharm不一样。在pycharm中我可以在目录project下建立project1,project2等等,且仅加载目录project为当前工作目录,这样不会影响编译。但VScode的编译需要通过makefile,不建议在工作目录建立多个项目的子目录,最好工作目录下就一个项目。

VScode并没有对编译调试过程完全封装,可以说只是使用json标记了编译调试中的参数,实际还是使用g++,make,gdb方法。我们先建立launch.json文件,修改program属性值从{workspaceRoot}变为{workspaceRoot}/main。这里main是最终用gdb调试的可执行程序的名字。

有了launch.json只是声明了gdb调试了步骤,但是编译还是要自己编写Makefile文件,调用make命令。为了避免每次调用make命令,可以在launch.json中添加"preLaunchTask": "build"来生成tasks.json文件,说明调试前的编译任务。推荐使用命令行版本,简单,容易理解。注意这里的build只是命令的名字,可以自定义,但是要和tasks.json中匹配才可以。

综上,我们向VScode制定了gdb的调试目标和make的编译目标,调试过程和其他IDE是相似的。剩下的就是makefile的编写,这个工作要靠cmake来帮我们做了。

cmake使用

推荐文章在 linux 下使用 CMake 构建应用程序,简单易懂。我个人理解cmake与make:cmake可以不同环境中的项目,自动测试编译器的特性,多文件管理,找库调包更方便。但要配置好也是很费劲的。

Linux下C++/C的编译调试的更多相关文章

  1. 【菜鸟玩Linux开发】在Linux中使用VS Code编译调试C++项目

    最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...

  2. 【转载】在Linux中使用VS Code编译调试C++项目

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

  3. 在Linux中使用VS Code编译调试C++项目

    最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...

  4. linux下如何产生core,调试core

    linux下如何产生core,调试core 摘自:http://blog.163.com/redhumor@126/blog/static/19554784201131791239753/ 在程序不寻 ...

  5. [转]Caffe在Linux下的安装,编译,实验

    Caffe在Linux下的安装,编译,实验  原文地址:http://www.cnblogs.com/evansyang/p/6150118.html 第一部分:Caffe 简介 caffe是有伯克利 ...

  6. Linux下librdkafka客户端的编译运行

    Linux下librdkafka客户端的编译运行 librdkafka是一个开源的Kafka客户端C/C++实现,提供了Kafka生产者.消费者接口. 由于项目需要,我要将Kafka生产者接口封装起来 ...

  7. Linux下FFmpeg的安装编译过程【转】

    本文转载自:http://www.linuxidc.com/Linux/2013-06/85628.htm 详细说下在Linux下FFmpeg的安装编译过程.参考 Ubuntu 10.04安装编译FF ...

  8. 重要:Linux下IDE--KDevelop (用来跟踪调试C++) Ubuntu下QT4开发环境的搭建及初体验

    Linux下安装Qt4有两大问题,一是环境变量,二是IDE(集成开发环境).安装Qt4也有两种方法,一种是apt-get,一种是下载源码包,而后 一种方法已经人证实是最有可能不好使的方法.所以我最终采 ...

  9. linux 下 VSCODE 使用CMake编译STM32程序

    项目在做什么 项目地址 本项目是为了研究MCU在linux下开发而做的 --build 存放cmake编译生成的文件 --cmake 存放cmake编译时会用到的文件,比如工具链检查.编译选项等 -- ...

随机推荐

  1. 某次送温暖考试的 c题

    题目大意: 给定n个点的无根树,树上每个点都有一个非负的点权. 树上的路径的价值定义为树上路径的点权和-树上路径的点权最大值; 现在给定一个参数P询问有多少条路径的价值是P的倍数(注意单点也算路径,路 ...

  2. 修改Linux内核参数提高Nginx服务器并发性能

    当linux下Nginx达到并发数很高,TCP TIME_WAIT套接字数量经常达到两.三万,这样服务器很容易被拖死.事实上,我们可以简单的通过修改Linux内核参数,可以减少Nginx服务器 的TI ...

  3. hello world 为什么我们看到学习中有这一句话!!!

    Hello World ,中文意思:你好,世界.世界上的第一个程序就是Hello World,由Brian Kernighan创作. Hello, world"程序是指在计算机屏幕上输出“H ...

  4. 在Windows上运行Linux

    在Windows上运行Linux 之前了解过一些适用于linux的Windows子系统,最近又听人提起,于是在自己的Windows 10专业版上安装了一个Ubuntu.运行起来还真方便,以后在wind ...

  5. Webservice接口的调用

    一.开发webservice接口的方式 1.jdk开发. 2.使用第三方工具开发,如cxf.shiro等等. 我这边介绍jdk方式webservice接口调用. 二.使用jdk调用webservice ...

  6. [编织消息框架][JAVA核心技术]异常应用

    QException是项目业务异常基类 按模块划分子类异常,方便定位那块出错 有个来源码属性code作用定位某个功能处理出错逻辑,数字类型节省内存空间,同时减少创建子类的子类 QSocketExcep ...

  7. C# 给枚举类型增加一个描述特性

    前言 相信很多人对枚举并不陌生,枚举可以很方便和直观的管理一组特定值.如果我们在页面上直接输出我们希望匹配的汉语意思或则其他满足我们需求的语句就更好了,当然,通常小伙伴们都会再页面上if(enum== ...

  8. 关于md5的使用方法

    本周工作,学习中用到了,md5. 在我们需要用到md5密码的时候,可以使用: System.Web.Security.FormsAuthentication.HashPasswordForStorin ...

  9. Node.js 蚕食计划(四)—— Express + SQL Server 搭建电影网站

    前段时间在慕课网上看了 scott 大神的<node+mongodb建站攻略>课程,按照自己的思路做了一遍,发博客记录一下 一.项目介绍 这个项目是一个简单的电影网站,由首页.详情页.评论 ...

  10. js介绍

    ---恢复内容开始--- js介绍 最近学习了js,那么我今天给大家介绍下js.希望对初学者有些帮助. js就是常说的JavaScript.JavaScript是目前世界上最流行的编程语言之一.这门语 ...