1、用GCC编译
1.1、创建源文件
#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、编译源文件
-
参数-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
% g++ -c -O2 reciprocal.cpp
|
1.3、链接对象文件
% g++ -o reciprocal main.o reciprocal.o
|
例如欲链接库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自动编译
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) run
Starting program: reciprocal
|
(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
|
(gdb) up 2
#2 0x804863e in main (argc=1, argv=0xbffff5e4) at main.c:8
8 i = atoi (argv[1]);
|
(gdb) print argv[1]
$2 = 0x0
|
(gdb) break main
Breakpoint 1 at 0x804862e: file main.c, line 8.
|
(gdb) next
9 printf (“The reciprocal of %d is %g\n”, i, reciprocal (i));
|
(gdb) step
reciprocal (i=7) at reciprocal.cpp:6
6 assert (i != 0);
|
分享到:
相关推荐
《Beginning Linux Programming, 4th Edition》(《Linux编程起步》第四版)是由Neil Matthew和Richard Stones编写,由Wiley Publishing公司出版的一本针对Linux程序设计的教材。该书详细介绍了Linux环境下的多种...
CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 ...
CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 camera ...
- 第1章:入门介绍 - 第2章:Shell编程 - 第3章:文件操作 - 第4章:Linux环境 - 第5章:终端 - 第6章:使用curses管理文本屏幕 - 第7章:数据管理 - 第8章:MySQL数据库 - 第9章:开发工具 - 第10章:...
《Linux内核编程入门》是一本专注于介绍Linux内核编程基础知识和技术的书籍。本书不仅适合初学者了解Linux内核的基本概念,也适合有一定经验的开发人员进一步深入学习内核编程的相关技术。 #### 二、章节概览 - **...
CHA1 第一个驱动与测试程序 CHA2 1 信号量同步 2 阻塞式读写 3 定时器 4 内存映射 5 /proc访问 6 工作队列 CHA3 LED.c LED灯驱动 button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 ...
在阿南的第一章内容中,可能涵盖了Linux操作系统的基础知识,包括操作系统的结构、进程管理、内存管理以及文件系统等。这些基础知识对于理解和操作ARM Linux至关重要,因为它们构成了Linux在任何硬件平台上的运行...
#### 第一章:操作系统基础概念 - **操作系统定义**:操作系统是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件。 - **早期计算模式**:早期的计算机没有操作系统,采用的...
《Linux程序设计》是一本由Neil Matthew和Richard Stones所著的关于Linux编程的经典教材,本书原名《Beginning Linux Programming, 4th Edition》,在国内被翻译为《Linux程序设计》。该书是Linux程序设计领域中非常...
第3章:介绍程序设计的规则,程序单元的基本内容、变量以及Kylix的工作模式等。 第4章:讲述触发事件及组件属性设置语句。 第5章:介绍使用If、CaseOf、For语句编写程序,并展示如何跟踪程序的流程。 第6章:介绍...
#### 第一章 Linux系统简介 **知识点解析:** 1. **UNIX的大部分代码是用一种流行的程序设计语言编写的,该语言是什么?** - **答案:** C语言 - **解析:** UNIX 操作系统的大部分代码都是用C语言编写的。这...
第2章“VM和Linux的安装”主要讲述如何在虚拟机上安装Linux,特别是CentOS这一流行的服务器发行版。虚拟机软件如VMware(VM)使得用户可以在一台物理机器上运行多个操作系统实例。安装CentOS时,需要了解基本的步骤...
在第一章【Linux快速入门】中,学习者需要掌握以下关键知识点: 1. **嵌入式Linux基础**:了解嵌入式Linux在市场上的广泛应用和快速发展,以及其在实时性、电源管理等方面的优势。理解Linux与GNU项目的关系,以及...
首先,我们从第1章“Linux快速入门”开始,这一章介绍了Linux操作系统的基本概念和历史,以及如何安装和使用Linux操作系统。学习者将了解到Linux的桌面环境、文件系统结构、基本命令行操作和文件管理,为后续深入...