`

[收集 转载]关于Linux下编写和编译程序的几个问题

阅读更多
FROM http://www.fmm7.com/jsjc/windows/Linux/200605/129858.html


我结合自己的经验,介绍一下Linux下编写和编译程序所要注意的几个问题,奉献给希望为Linux的发展作出贡献的人们。
 

Linux下怎样编译程序?
 

大多数Linux程序都是由C语言编写的并由GNU C编译而成。现在GCC是各种发行套件的一部分。有关最新GCC编译器的版本、文章和补丁请看ftp://ftp.gnu.org/pub/gnu/。

由C++编写的程序必须由GNU C++编译,GNU C++也是各种发行套件的一部分,在以上网址也有最新版本和补丁。

编译2.0.x的内核需要2.7.2.x版本的GCC,如用象GCC 2.8.x, EGCS, or PGCC别的编译器编译内核可能产生不可预想的后果。

 

怎样移植其它Unix程序到Linux上?
 

总得来说,Unix上的程序不需要做改动,只要简单的按照提示就可以移植到Linux上,如果安装过程中出现错误信息,而你又不知道怎么处理,你可以猜或略去,不过这样产生的程序往往带有bug。所以最好还是问一下有经验的人。

如果要从BSD-ish移植程序,试一试在编译时加上-I/usr/include/bsd 和 ?lbsd命令。

 

什么是ld.so,从哪可以找到它?
 

ld.so是动态函数库装载器。过去,使用共享函数库的程序在原代码开头使用约3K的空间来寻找和加载共享函数库,现在,这段代码被加进了一个特殊共享函数库/lib/ld.so,所有的程序都可以使用该共享库,这样就节省了磁盘空间,而且升级方便。

ld.so可以从以下网址得到tsx-11.mit.edu/pub/linux/packages/GCC/。

 

怎样升级库函数而不使系统崩溃?
 

注意:进行此操作应该养成做备份的习惯,因为这项操作很容易出错。

如果你升级象libc4这样的老函数库,这个过程会变得非常困难。而且你应该在该系统上让libc4和libc5共存,因为,有些老程序还需要它。升级libc5也一样。

升级动态库的问题常出现在当你移走老的函数库时,用来升级的程序也运行不了了。有许多方法可以解决这个问题。一个方法就是暂时备份一下运行程序所需函数库,它们一般在/lib/、/usr/lib/、 /usr/local/lib/、或其它的地方,在文件/etc/ld.so.conf中都有详细记录。

例如,当你升级libc5时,目录/lib/中有如下文件

libc.so.5

libc.so.5.4.33

libm.so.5

libm.so.5.0.9

这些是C函数库和数学库,拷贝它们到文件/etc/ld.so.conf中含有的其它的目录,如/usr/lib/中:

cp -df /lib/libc.so.5* /usr/lib/

cp -df /lib/libm.so.5* /usr/lib/

ldconfig

一定要记住运行ldconfig来升级函数库的配置文件。

文件libc.so.5 和 libm.so.5是实际库文件的链接文件,当你升级的时候,如果老的链接文件存在,新的链接不会产生,除非你使用CP命令的-f选项。CP的-d选项只复制链接文件,不复制原文件。

如果你需要直接覆盖链接,使用ln命令的选项-f。

例如,拷贝新的库函数覆盖旧的。先对新的函数库做一个链接,然后把函数库和链接一起拷贝到/lib/中,命令如下:

ln -sf ./libm.so.5.0.48 libm.so.5

ln -sf ./libc.so.5.0.48 libc.so.5

cp -df libm.so.5* /lib

cp -df libc.so.5* /lib

重申一下,拷贝完别忘记运行ldconfig.

如果一切工作顺利的话,你可以删除老的函数库的备份。

 

我能否把在486上编译的代码或编译器拿到386上用?
 

当然,除非你编译的是内核。

GCC用来在486上编译的选项-m486 只是优化了所编译程序,使其运行快一些。这些编译的程序仍能很好的在386上运行,只是效果差一些。

然而,从内核1.3.35以后,采用486或Pentium选项编译的内核不能用于386的机器。

GCC可以针对386和486进行配置。两者区别在于,针对386配置的GCC把-m386作为缺省选项,而针对486配置的GCC把-m486作为缺省选项,仅此而已。

 

gcc -O6可以干什么?
 

目前,它和 -O2 (GCC 2.5) 或 -O3 (GCC 2.6, 2.7)功能一样,所有版本大于它的功能也一样。新版内核的Makefiles使用-O2,所以你也应该用-O2。

 

linux/*.h 和asm/*.h在什么地方?
 

目录 /usr/include/linux/ 和 /usr/include/asm/低下的文件是内核头文件的软链接,内核头文件其实在目录/usr/src/kernel*/低下。

 

怎样作一个共享函数库?
 

对ELF, 命令如下:

gcc -fPIC -c *.c

gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o

对a.out,从 http://tsx-11.mit.edu/pub/linux/packages/GCC/src/ 下载n.nn.tar.gz,其中包含详细说明。建议你将共享库由a.out升级为ELF。

 

为什么我编译的可执行程序非常大?
 

用ELF编译器,生成可执行程序太大最可能的原因是没有合适的.so库与你使用的库函数链接。对每一个象libc.so.5.2.18的函数库,应该有一个象libc.so的链接。

用a.out编译器,生成可执行程序太大可能是使用了-g选项,这会生成静态链接库而不是动态链接库。

 

从哪可以得到对于Linux的‘lint’?
 

大部分‘lint’的功能已经内置进了GCC,打开GCC的-Wall选项会打开许多有用的外部警告。

还有一个叫`lclint'的软件功能和传统的lint差不多,原代码可以在http://larch.lcs.mit.edu/ /pub/Larch/lclint/中找到。
分享到:
评论

相关推荐

    关于Linux下编写和编译程序的几个问题

    本文将探讨几个在Linux环境下编写和编译程序的关键问题。 首先,Linux下的大多数程序都是用C语言编写的,并通过GNU Compiler Collection (GCC) 进行编译。GCC不仅支持C语言,还支持C++和其他多种编程语言。要获取...

    linux下GCC编译C程序

    在Linux环境下,C程序的编译通常涉及以下几个步骤: 1. **编译单个源文件**:创建一个简单的C程序,例如经典的"Hello World"程序,然后使用`gcc`命令编译。例如: ```bash gcc -o hello hello.c ``` 这会生成名...

    linux自己编写的几个arm-Linux驱动程序

    在给定的标题“linux自己编写的几个arm-Linux驱动程序”中,我们可以推断出这是一组专门为ARM架构的Linux系统开发的驱动代码。ARM处理器广泛应用于嵌入式设备和移动设备,因此,这些驱动程序可能是为这些平台设计的...

    LINUX下多个c程序编译链接的程序

    在Linux环境下,编写和管理多个C程序可能会变得复杂,尤其是当这些程序之间存在依赖关系时。本主题将深入探讨如何在Linux下有效地编译和链接多个C程序,并结合`makefile`来自动化这个过程。 首先,理解C程序的编译...

    linux驱动程序的编写

    为了更好地理解和编写Linux驱动程序,我们需要掌握以下几个关键技术: 1. **时钟机制**:在设备驱动程序中,常常需要使用到定时功能,比如协议的超时处理、轮询操作等。Linux提供了多种时钟机制,包括定时器和延时...

    linux下驱动程序模块编程多文件makefile编写示例

    本示例主要探讨的是如何为Linux驱动程序模块编写一个多文件的Makefile,以便于编译和加载。 首先,我们需要理解Makefile的基本结构和规则。Makefile由一系列的目标(target)和依赖(dependency)组成,目标通常是...

    Linux驱动程序教程:如何编写简单的Linux设备驱动程序

    源代码通常包含以下几个部分: - `driver.c`:驱动的主要实现,包括设备结构体定义、操作函数实现和模块初始化/清理函数。 - `Makefile`:编译规则,用于构建模块。 - `Kconfig`:配置选项,允许用户在内核配置阶段...

    linux下编写最简单C++程序的过程屏幕录像

    在Linux环境下编写C++程序是许多初学者踏入编程世界的必经之路。本教程将通过"Ubuntu Movie.avi"这个屏幕录像,向你展示一个简单的C++程序编写过程。在这个过程中,我们将涉及以下几个关键知识点: 1. **Linux操作...

    linux驱动程序编写

    Linux驱动程序的编写涉及以下几个关键知识点: 1. **内核空间与用户空间**:在Linux系统中,驱动程序运行在内核空间,而应用程序则运行在用户空间。为了安全和效率,它们之间通过系统调用和中断处理进行通信。 2. ...

    Linux下qt动态库创建和使用

    总结,创建和使用Linux下Qt环境的动态库主要包括以下几个关键点: - 修改.pro文件以设置为动态库项目。 - 编写库的源代码,并确保编译成功生成.so文件。 - 在使用动态库的项目中添加库路径和链接选项。 - 正确包含...

    Linux基本应用程序编写

    在Linux环境下编写C语言程序通常涉及以下几个步骤: 1. **选择合适的文本编辑器**:推荐使用`vi`或`vim`编辑器,它们是Linux系统中最常见的文本编辑器之一。 2. **编写Hello World程序**:以下是一个简单的示例代码...

    linux下编译通过的lua库_5.1.4

    编译Lua库的过程涉及以下几个步骤: 1. 解压源码:首先,你需要解压lua-5.1.4.tar.gz这样的源码包,通常通过tar -zxvf命令完成。 2. 配置环境:进入解压后的目录,使用./configure命令检查编译环境并生成Makefile。...

    Linux下编译程序的三种方式PPT课件.pptx

    在Linux环境下,编写和编译程序是开发过程中的重要步骤。本PPT主要介绍了三种编译程序的方法:使用gcc命令、使用make工具以及更高级的makefile管理。下面将详细阐述这三种方式。 1. gcc命令编译 gcc是GNU Compiler ...

    Linux编译运行

    本知识点将详细介绍Linux环境下,如何使用各种常用编译器来编译和执行串行程序以及并行程序,并简要介绍Makefile工具的使用方法。通过对本知识点的学习,读者将能够快速掌握Linux环境下程序编译与运行的基本操作。 ...

    linux下makefile文件编写详细步骤

    Makefile是用于自动化构建过程的一种脚本文件,在Linux环境下广泛应用于软件项目管理、编译和链接等多个环节。通过定义一系列规则来指定如何编译和链接源代码,使得项目构建变得更加简单高效。 #### 二、Makefile...

    Linux环境下用串口编写打印机驱动程序

    接下来,编写驱动程序时,我们需要实现几个关键函数。一是`open()`函数,当应用程序打开设备文件时会调用它,用于初始化串口并设置通信参数。二是`write()`函数,负责将数据写入串口,也就是打印机的打印命令。三是`...

    反编译神器jeb(linux版)

    反编译通常包括以下几个步骤: 1. APK解析:首先,JEB会读取APK文件,解析其ZIP结构,提取出DEX文件(Dalvik执行文件)。 2. 字节码反编译:然后,JEB将DEX文件中的字节码转换为人类可读的Java源代码。 3. 优化和...

    Linux下编译程序的三种方式PPT学习教案.pptx

    在Linux操作系统中,编写和编译程序是软件开发的基础步骤。本教程主要涵盖了在Linux环境下编译程序的三种主要方式:使用gcc、使用make以及更高级的自动化构建工具。以下是这些方法的详细说明: 1. **gcc编译器**: ...

    基于ARM-Linux下交叉编译的手持医疗终端项目

    在本文中,我们将深入探讨"基于ARM-Linux下交叉编译的手持医疗终端项目",这是一个结合了硬件、操作系统和应用程序开发的综合实践。项目利用QT开发工具在ARM架构的板子上,如Mini2440,实现了一个功能丰富的手持医疗...

Global site tag (gtag.js) - Google Analytics