高级Linux程序设计第一章:入门
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程序设计第一章:入门相关推荐
- .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员的自白 这篇文章会这么火,更没想到的是张善友队长的公众号居然也转载了这篇文章,这就导致两天的时间就有两百多位读者朋友加 ...
- Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】
Educoder–Java高级特性(第一章)- IO流[笔记+参考代码] 第一关 1.下列关于字节和字符的说法正确的是(BC) A.字节 = 字符 + 编码 B.字符 = 字节 + 编码 C.字节 = ...
- (Raytracing)光线追踪技术 - 第一章 – 入门
(Raytracing)光线追踪技术 - 第一章 – 入门 RAYTRACING TOPICS & TECHNIQUES - PART 1 – INTRODUCTION 原作者:Jacco B ...
- 【高级数据库】第一章 第01讲 数据库概述
[高级数据库]第一章 DBMS系统概述 博主学院最近有关于高级数据库的课程,为了很好的记录高级数据库的相关知识点,开辟了以<数据库系统实现(第二版)>为基础,结合学院课程具体的内容,编 ...
- 【高级数据库】第一章 第02讲 DBMS概述
[高级数据库]第一章 DBMS系统概述 上一讲主要介绍数据库.数据库管理系统.数据仓库等的基本概念.本节详细讲解数据库管理系统的原理. 第02讲 DBMS概述 DBMS又称数据库管理系统,主要 ...
- Linux基础第一章 概述
第一章 概述 1.1 前言 本章讨论系统的概念,从硬件.操作系统角度更加深刻的理解计算机系统,并快速浏览Linux系统提供的服务. 1.2 系统组成 1.3 操作系统和应用程序 操作系统这个词语有二意 ...
- Python绝技第一章 入门 python3实现密码破解
前言 对我而言,武术的非凡之处在于它的简单.简单的方法也是正确的方法,同时武术也没有什么特别之处.越接近武术的真谛,招式表现上浪费越少 简介 python 绝技 第一章是python入门语法,两个需要 ...
- PL/SQL程序设计 第一章 PL/SQL 程序设计简介
PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问.由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理.除此之外,可以在O ...
- 【Linux】第一章 整合 JDK 和 MariaDB(附 Linux 基本命令)
第一章 整合 JDK 和 MariaDB 文章目录 第一章 整合 JDK 和 MariaDB 一.整合 JDK 1.上传 JDK 安装包 3.配置 Linux 环境变量 4.JDK 环境测试 二.整合 ...
- Kali Linux 秘籍 第一章 安装和启动Kali
第一章 安装和启动Kali 作者:Willie L. Pritchett, David De Smet 译者:飞龙 协议:CC BY-NC-SA 4.0 简介 Kali Linux,简称Kali,是用 ...
最新文章
- VS2010项目生成时提示错误“在证书存储区中找不到清单签名证书”?
- PHP中遍历关联数组的方法
- 微服务架构与Spring Cloud Alibaba
- Android 绘制动态图
- 埃森哲携手阿里云,采用K8s容器云服务为客户提供无限弹性
- 使用docker部署vue_如何使用Vue,Docker和Azure进行持续交付
- 【Elasticsearch】Elasticsearch之元数据(meta-fields)介绍
- aix下oracle备份脚本,AIX下oracle的自动备份
- .gitignore中添加了忽略规则为何还是会提示版本更新,git如何清除部分文件的版本管理
- python与java前景-数据告诉你,Python、Java、C+哪个更有发展前途?
- Java--文本文档编写Java代码
- 在ubuntu下安装Dynamips
- C语言找出1000之内的完数
- Linux中查看文件夹大小的命令
- 新手怎么在GitHub上传代码?----最新教程
- uni-app上传安卓应用市场的坑
- 微信支付开发 服务商模式 签名错误
- 攻防演练中防守方的骚姿势
- nsh 自定义启动脚本
- MFC如何在单文档下添加背景图片