1、用GCC编译

1.1、创建源文件

  • (main.c) C 源文件 - main.c

#include <stdio.h>

#include “reciprocal.hpp”

int main (int argc, char **argv)

{

int i;

i = atoi (argv[1]);

printf (“The reciprocal of %d is %g\n”, i, reciprocal (i));

return 0;

}

  • (reciprocal.cpp) C++ 源文件 - reciprocal.cpp

#include <cassert>

#include “reciprocal.hpp”

double reciprocal (int i) {

// I should be non-zero.

assert (i != 0);

return 1.0/i;

}

  • (reciprocal.hpp) 头文件 - reciprocal.hpp

#ifdef __cplusplus

extern “C” {

#endif

extern double reciprocal (int i);

#ifdef __cplusplus

}

#endif

1.2、编译源文件

  • 编译main.c:

% gcc -c main.c

  • 编译reciprocal.cpp:

% g++ -c reciprocal.cpp

  • 参数-I指定搜索头文件的位置。

  • 默认情况下,GCC在当前文件夹及标准库的头文件所在的文件夹来搜索头文件。

% g++ -c -I ../include reciprocal.cpp

  • 可以用参数-D在命令行设定宏(macro),并且可以设定宏的值

对于如下程序definemacro.c:

#include "stdio.h"

#include "stdlib.h"

int main(int argc, char** argv){

int i = 3;

#ifdef CHANGEVALUE

i = 4;

#endif

printf("i = %d\n", i);

printf("PT = %f\n", PI);

}

如果编译时命令行为gcc definemacro.c,会报‘PI’ undeclared错误。

如果编译时命令行为gcc -D PI=3.14 definemacro.c,则输出如下:

i = 3
PT = 3.140000

如果编译时命令行为gcc -D PI=3.14 -D CHANGEVALUE definemacro.c,则输出如下:

i = 4
PT = 3.140000

  • 可以用GCC编译时优化代码.

% g++ -c -O2 reciprocal.cpp

1.3、链接对象文件

  • g++可以将.o对象文件链接成程序

% g++ -o reciprocal main.o reciprocal.o

  • 如果想链接其他库文件,则用参数-I

例如欲链接库libpam.a,则用如下命令行,编译器会自动加上前缀lib和后缀.a

% g++ -o reciprocal main.o reciprocal.o –lpam

  • 链接器默认在/lib和/usr/lib文件夹下面寻找系统标准库。

  • 如果想从其他的文件夹下面寻找要链接的库,则从参数-L指定

% g++ -o reciprocal main.o reciprocal.o -L/usr/local/lib/pam –lpam

2、用Make自动编译

  • Makefile如下:

reciprocal: main.o reciprocal.o

g++ $(CFLAGS) -o reciprocal main.o reciprocal.o

main.o: main.c reciprocal.hpp

gcc $(CFLAGS) -c main.c

reciprocal.o: reciprocal.cpp reciprocal.hpp

g++ $(CFLAGS) -c reciprocal.cpp

clean:

rm -f *.o reciprocal

  • 首先是编译目标(target),紧接着是一个冒号:,然后是完成目标所需的依赖(dependencies)

  • 下一行是完成编译目标的规则

  • 规则行必须以Tab键开头

  • $(CFLAGS)是make变量,变量可以再Makefile中定义,也可以在命令行定义

% make CFLAGS=-O2

gcc -O2 -c main.c

g++ -O2 -c reciprocal.cpp

g++ -O2 -o reciprocal main.o reciprocal.o

3、用GDB调试

3.1、带调试信息编译

  • 如果要在编译时带调试信息,则在编译时命令行用-g参数

% make CFLAGS=-g

gcc -g -c main.c

g++ -g -c reciprocal.cpp

g++ -g -o reciprocal main.o reciprocal.o

3.2、运行GDB

  • 启动GDB

% gdb reciprocal

  • 命令run加参数可运行程序

(gdb) run

Starting program: reciprocal

  • 命令where可以查看Stack

(gdb) where

#0 __strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0) at strtol.c:287

#1 0x40096fb6 in atoi (nptr=0x0) at ../stdlib/stdlib.h:251

#2 0x804863e in main (argc=1, argv=0xbffff5e4) at main.c:8

  • 用up命令可以弹出运行栈

(gdb) up 2

#2 0x804863e in main (argc=1, argv=0xbffff5e4) at main.c:8

8 i = atoi (argv[1]);

  • 用print命令可以查看变量值

(gdb) print argv[1]

$2 = 0x0

  • 用break命令可以设定断点

(gdb) break main

Breakpoint 1 at 0x804862e: file main.c, line 8.

  • 用next命令执行下一条语句

(gdb) next

9 printf (“The reciprocal of %d is %g\n”, i, reciprocal (i));

  • 用step命令可以进入一个函数

(gdb) step

reciprocal (i=7) at reciprocal.cpp:6

6 assert (i != 0);

高级Linux程序设计第一章:入门相关推荐

  1. .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

    写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员的自白 这篇文章会这么火,更没想到的是张善友队长的公众号居然也转载了这篇文章,这就导致两天的时间就有两百多位读者朋友加 ...

  2. Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】

    Educoder–Java高级特性(第一章)- IO流[笔记+参考代码] 第一关 1.下列关于字节和字符的说法正确的是(BC) A.字节 = 字符 + 编码 B.字符 = 字节 + 编码 C.字节 = ...

  3. (Raytracing)光线追踪技术 - 第一章 – 入门

    (Raytracing)光线追踪技术 - 第一章 – 入门 RAYTRACING TOPICS & TECHNIQUES - PART 1 – INTRODUCTION 原作者:Jacco B ...

  4. 【高级数据库】第一章 第01讲 数据库概述

    [高级数据库]第一章 DBMS系统概述   博主学院最近有关于高级数据库的课程,为了很好的记录高级数据库的相关知识点,开辟了以<数据库系统实现(第二版)>为基础,结合学院课程具体的内容,编 ...

  5. 【高级数据库】第一章 第02讲 DBMS概述

    [高级数据库]第一章 DBMS系统概述   上一讲主要介绍数据库.数据库管理系统.数据仓库等的基本概念.本节详细讲解数据库管理系统的原理. 第02讲 DBMS概述   DBMS又称数据库管理系统,主要 ...

  6. Linux基础第一章 概述

    第一章 概述 1.1 前言 本章讨论系统的概念,从硬件.操作系统角度更加深刻的理解计算机系统,并快速浏览Linux系统提供的服务. 1.2 系统组成 1.3 操作系统和应用程序 操作系统这个词语有二意 ...

  7. Python绝技第一章 入门 python3实现密码破解

    前言 对我而言,武术的非凡之处在于它的简单.简单的方法也是正确的方法,同时武术也没有什么特别之处.越接近武术的真谛,招式表现上浪费越少 简介 python 绝技 第一章是python入门语法,两个需要 ...

  8. PL/SQL程序设计 第一章 PL/SQL 程序设计简介

    PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问.由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理.除此之外,可以在O ...

  9. 【Linux】第一章 整合 JDK 和 MariaDB(附 Linux 基本命令)

    第一章 整合 JDK 和 MariaDB 文章目录 第一章 整合 JDK 和 MariaDB 一.整合 JDK 1.上传 JDK 安装包 3.配置 Linux 环境变量 4.JDK 环境测试 二.整合 ...

  10. Kali Linux 秘籍 第一章 安装和启动Kali

    第一章 安装和启动Kali 作者:Willie L. Pritchett, David De Smet 译者:飞龙 协议:CC BY-NC-SA 4.0 简介 Kali Linux,简称Kali,是用 ...

最新文章

  1. VS2010项目生成时提示错误“在证书存储区中找不到清单签名证书”?
  2. PHP中遍历关联数组的方法
  3. 微服务架构与Spring Cloud Alibaba
  4. Android 绘制动态图
  5. 埃森哲携手阿里云,采用K8s容器云服务为客户提供无限弹性
  6. 使用docker部署vue_如何使用Vue,Docker和Azure进行持续交付
  7. 【Elasticsearch】Elasticsearch之元数据(meta-fields)介绍
  8. aix下oracle备份脚本,AIX下oracle的自动备份
  9. .gitignore中添加了忽略规则为何还是会提示版本更新,git如何清除部分文件的版本管理
  10. python与java前景-数据告诉你,Python、Java、C+哪个更有发展前途?
  11. Java--文本文档编写Java代码
  12. 在ubuntu下安装Dynamips
  13. C语言找出1000之内的完数
  14. Linux中查看文件夹大小的命令
  15. 新手怎么在GitHub上传代码?----最新教程
  16. uni-app上传安卓应用市场的坑
  17. 微信支付开发 服务商模式 签名错误
  18. 攻防演练中防守方的骚姿势
  19. nsh 自定义启动脚本
  20. MFC如何在单文档下添加背景图片

热门文章

  1. bzoj 2555: SubString
  2. python函数中的关键字参数
  3. poj 3984 迷宫问题(bfs 打印路径)
  4. [转] 关于MSCOMM控件的一些说明
  5. jwt token and shiro
  6. CSS color设置与调色板
  7. Centos7配置ThinkPHP5.0完整过程(二)
  8. 高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告
  9. 【学校集训】【USACO15DecG】Bessie's Dream
  10. 常用工具下载及在线地址