实验六 Linux开发工具的使用(一)

实验六 Linux开发工具的使用(一)

一、实验目的
掌握C语言编译的基本方法。
二、实验注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。
要求每个同学登录后系统后,要在自己的家目录下创建一个属于自己的子目录(以自己(拼音)名字或学号)。以后所有工作都要在自己的目录内进行。建议以后的实验都在同台计算机上做,这样可以保持连续性。
用户要按通常实验要认真书写实验报告。
三、实验内容及步骤
1.用gcc带不同参数编译下列hello.c程序。

#include <stdio.h>
int main()
{
	printf(”Hello World!\n”);
    return 0;
}

(1)只作预处理,生成hello.i,相应命令为: gcc -E hello.c -o hello.i

(2)只进行编译,不做汇编,生成汇编代码,命令为: gcc -S hello.c

(3)只进行汇编,不做连接,生成目标代码,命令为: gcc -c hello.c

(4)以默认方式生成可执行程序a.out,命令为: gcc hello.c

(5)生成可执行程序hello,命令为: gcc hello.c -o hello
2.Linux下gcc的生成和使用动态库和静态库
程序1: hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif
程序2:hello.c
#include <stdio.h>
void hello(const char *name) {
printf(“Hello %s!\n”, name);
}
程序3:main.c
#include “hello.h”
int main()
{
hello(“everyone”);
return 0;
}
注意:这个时候,我们编译好的hello.o是无法通过gcc –o 编译的,这个道理非常简单,hello.c是一个没有main函数的.c程序,因此不够成一个完整的程序,如果使用gcc –o 编译并连接它,GCC将报错。
无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。
这个时候我们有三种思路:
1) 通过编译多个源文件,直接将目标代码合成一个.o文件。
2) 通过创建静态链接库libmyhello.a,使得main函数调用hello函数时可调用静态链接库。
3) 通过创建动态链接库libmyhello.so,使得main函数调用hello函数时可调用动态链接库。
思路一:编译多个源文件
命令为:
gcc -c hello.c
gcc -c main.c
gcc -o hello hello.o main.o

在这里插入图片描述

思路二:静态链接库
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时,需要注意这点。创建静态库用ar命令。
在系统提示符下键入以下命令将创建静态库文件libmyhello.a。
# ar rcs libmyhello.a hello.o
在这里插入图片描述

在主程序main中直接调用公用函数hello,生成目标程序hello的命令为:
gcc -o hello main.c -static -L. -lmyhello
在这里插入图片描述

删除静态库文件试试公用函数hello,看是否真的连接到目标文件 hello,命令为:
rm libmyhello.a
在这里插入图片描述

思路三、动态链接库(共享函数库)
静态链接库的一个缺点是,如果我们同时运行了许多程序,并且它们使用了同一个库函数,这样,在内存中会大量拷贝同一库函数。这样,就会浪费很多珍贵的内存和存储空间。使用了共享链接库的Linux就可以避免这个问题。
共享函数库和静态函数在同一个地方,只是后缀有所不同。比如,在一个典型的Linux系统,标准的共享数序函数库是/usr/lib/libm.so。
当一个程序使用共享函数库时,在连接阶段并不把函数代码连接进来,而只是链接函数的一个引用。当最终的函数导入内存开始真正执行时,函数引用被解析,共享函数库的代码才真正导入到内存中。这样,共享链接库的函数就可以被许多程序同时共享,并且只需存储一次就可以了。共享函数库的另一个优点是,它可以独立更新,与调用它的函数毫不影响。
在系统提示符下键入以下命令得到动态库文件libmyhello.so
# gcc -shared -fPIC -o libmyhello.so hello.o
在这里插入图片描述

“PIC”命令行标记告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该消息代码的应用程序会将它连接到哪一段内存地址空间。这样编译出的hello.o可以被用于建立共享链接库。建立共享链接库只需要用GCC的”-shared”标记即可。
运行gcc命令生成目标文件,命令为:
gcc -o hello main.c -L. -lmyhello
在这里插入图片描述

错误提示,找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。有多种方法可以解决,
(1)我们将文件 libmyhello.so复制到目录/usr/lib中,再试试。

# mv libmyhello.so /usr/lib 
# ./hello

成功!
在这里插入图片描述

(2)既然连接器会搜寻LD_LIBRARY_PATH所指定的目录,那么我们可以将这个环境变量设置成当前目录:
先执行:

export LD_LIBRARY_PATH=`pwd` 

再执行:

./hello

成功!
在这里插入图片描述

LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

四、实验报告要求
1.以书面形式记录下你操作的每一步过程,包括编译过程。
2.回答所提出的问题。
3.总结上机调试过程中所遇到的问题和解决方法及感想。

熟练掌握gcc命令各个选项的使用,-o选项可以用于生成要生成的文件名。
连接模式分为静态连接和动态链接,gcc在连接时优先使用动态链接库,
若要强制使用静态链接库则需要使用选项-static。

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值