`
forfuture1978
  • 浏览: 412954 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

高级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);

2
3
分享到:
评论

相关推荐

    Linux程序设计 第4版.haozip01

    Linux程序设计 分卷文件共有以下2个: Linux程序设计 第4版.haozip01.zip Linux程序设计 第4版.haozip02.zip 基本信息 原书名: Beginning Linux Programming 原出版社: Wrox 作者: (英)Neil Matthew Richard ...

    Linux程序设计 第4版.haozip02

    Linux程序设计 分卷文件共有以下2个: Linux程序设计 第4版.haozip01.zip Linux程序设计 第4版.haozip02.zip 基本信息 原书名: Beginning Linux Programming 原出版社: Wrox 作者: (英)Neil Matthew Richard ...

    嵌入式Linux驱动程序设计从入门到精通.part01.rar

    CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 ...

    嵌入式Linux驱动程序设计从入门到精通.part04.rar

    CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 camera ...

    嵌入式Linux驱动程序设计从入门到精通.part02.rar

    CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 ...

    嵌入式linux驱动程序设计从入门到精通 char10

    嵌入式linux驱动程序设计从入门到精通 第10章(看清楚,仅仅是一章,别喷),其他章节到我的其他资源中找。好像转换时有问题,页面大小不一,也不是很清晰,凑合看吧^_^ 仅供学习,喜欢请购买正版书籍

    嵌入式linux驱动程序设计从入门到精通 char11

    嵌入式linux驱动程序设计从入门到精通 第11章(看清楚,仅仅是一章,别喷),其他章节到我的其他资源中找。好像转换时有问题,页面大小不一,也不是很清晰,凑合看吧^_^ 仅供学习,喜欢请购买正版书籍

    Linux环境数据库管理员指南

    书中每一章基本都是独立的,介绍某个特定的数据库。 第1章:Linux操作系统 简要介绍Linux。本章介绍了Linux历史及其背景知识,对不熟悉Linux和开放源代码运动的读者很有帮助。 第2章:基本Red Hat Linux安装 给出...

    嵌入式Linux驱动程序设计从入门到精通.part03.rar

    CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 ...

    嵌入式Linux驱动程序设计从入门到精通.part06.rar

    CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 camera ...

    嵌入式Linux驱动程序设计从入门到精通.part08.rar

    CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 camera ...

    嵌入式Linux驱动程序设计从入门到精通.part07.rar

    CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 camera ...

    嵌入式Linux驱动程序设计从入门到精通.part09.rar

    CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 camera ...

    嵌入式Linux驱动程序设计从入门到精通.part05.rar

    CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 camera ...

    C程序设计语言(第2版·新版中文)

    windows程序设计第五版(中文版) 贪吃蛇 游戏 C++ C# 程序开发范例宝典(第二版) 源代码 20~21 C、C++面试题大全 Java程序员就业面试大全 程序员面霸手册(笔试面试的葵花宝典) visual c++6.0应用编程150例...

    SLAM导航机器人零基础实战系列-全部PDF文档整理.zip

    4.如何编写ROS的第一个程序hello_world 5.编写简单的消息发布器和订阅器 6.编写简单的service和client 7.理解tf的原理 8.理解roslaunch在大型项目中的作用 9.熟练使用rviz 10.在实际机器人上运行ROS高级功能...

    Android程序设计基础

    丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115215369 上架时间:2009-11-6 出版日期:2009 年11月 开本:16开 页码:196 版次:1-1 编辑推荐  你的第一本Android书.  Pragmatic系列...

    TCP/IP协议与网络编程技术

    第7章:介绍了网络程序设计有关的基础知识、一个网络程序入门实例和Winsock中编写网络程序常用的建立连接、传输数据、关闭连接等有关的函数。 第8章:介绍了TCP程序设计流程、基于C/C++的TCP程序设计实例和基于Java...

    linux驱动学习去开发入门

    (1)第一章 模块(Modules) URL:http://greenlinux.blogcn.com/diary,103232026.shtml (2)《从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响》 URL:...

Global site tag (gtag.js) - Google Analytics