Linux预习

静态库过程如下:

(1) 进入libtest/lib目录,执行命令:

gcc -c -I../include hello.c

该命令生成目标文件hello.o,注意:参数-I添加头文件搜索目录,这里因为hello.c中有#include “hello.h”,hello.h在libtest/include目录中,这里需要指定该目录通知gcc,否则出现错误提示“找不到头文件hello.h”。

这一步将在libtest/lib目录中生成一个hello.o文件。

(2) 在libtest/lib目录,执行命令:

ar rc libhello.ahello.o

该命令将hello.o添加到静态库文件libhello.a,ar命令就是用来创建、修改库的,也可以从库中提出单个模块,参数r表示在库中插入或者替换模块,c表示创建一个库,关于ar命令的详细使用规则可以参考文章http://blog.csdn.net/xuhongning/article/details/6365200。

这一步将在libtest/lib目录中生成一个libhello.a文件。

(3) 进入libtest/src目录,执行命令:

gcc main.c-I../include -L../lib -lhello -o main

该命令将编译main.c并链接静态库文件libhello.a生成可执行文件main,注意:参数-L添加库文件搜索目录,因为libhello.a在libtest/lib目录中,这里需要指定该目录通知gcc,参数-l指定链接的库文件名称,名称不用写全名libhello.a,只用写hello即可。

这一步将在libtest/src目录中生成可执行文件main。



动态库过程如下:

(1) 进入libtest/lib目录,执行命令:

gcc hello.c-I../include -fPIC -shared -o libhello.so

这一步将在当前目录生成动态库文件libhello.so,参数-fPIC -shared固定格式,不用纠结他们什么意思。

(2) 进入libtest/src目录,执行命令:

gcc main.c-I../include -L../lib -lhello -o main

此时在当前目录中已经生成了可执行文件main,执行./main时却提示错误:

./main: error while loading shared libraries: libhello.so: cannotopen shared object file: No such file or directory

也就是找不到动态库文件libhello.so,在网上找了答案说如果遇到这样的问题需要设置环境变量LD_LIBRARY_PATH,如下:

export LD_LIBRARY_PATH=”../lib”

gcc main.c -I../include -L../lib -lhello -o main

然后再执行./main就没有错误了。
Make工程管理器就是个自动编译管理器,它通过读取Makefile文件的内容来执行大量的编译工作。用户只需要写一句简单的编译语句就可以了,大大提高了项目的工作效率。虽然它没有windows下的集成开发环境的界面好,但却有着异常灵活的自由度。对于一个专业人士来说,make的使用会更能提高项目的效率。

1. Makefile的基本结构

Makefile的编写规则。在一个Makefile中通常包括如下内容:a. 需要由make工具创建的目标体(target),通常是目标文件或可执行文件;b. 要创建的目标体所依赖的文件(dependency_file);c. 创建每个目标时需要的命令(command)。如下所示:

1 #The simplest example
2
3 hello.o: hello.c hello.h
4   gcc -c hello.c -o hello.o

然后我们就可以使用make了。如:make hello.o。

这样Makefile执行了hello.o对应的命令语句,生成hello.o目标体。

2. Makefile变量

上例的Makefile在实际中是几乎不存在的,因为它过于简单,这种情况完全没必要编写makefile而只需要在shell中直接输入即可,而在实际中使用的makefile往往是包含很多的文件和命令的。例如:

1 sunq: kang.o yul.o
2   gcc kang.o yul.o -o sunq
3
4 kang.o: kang.c kang.h
5   gcc -wall -o -g -c kang.c -o kang.o
6
7 yul.o: yul.c yul.h
8   gcc -wall -o -g -c yul.c -o yul.o


在这个makefile中有3个目标体(target),分别是sunq、kang.o和yul.o,其中第一个目标体的依赖文件就是后两个目标体。如果用户使用make sunq则make管理器就是从sunq目标体开始执行。在检查kang.o、yul.o和sunq这三个文件的时间戳之前,他会向下查找那些把kang.o或yul.o作为目标文件的时间戳。比如kang.o的依赖关系为kang.c、kang.h、head.h。如果这些文件中的任一个文件的时间戳比kang.o新,则命令gcc -wall -o -g -c kang.c -o kang.o 将会执行。

为了简化编辑和维护makefile,make允许在makefile中创建和使用变量,用来代替一个文本字符串。这里变量的定义有两种方式,一种使递归方式,另一种是简单方式。递归展开式可以在变量中引用别的变量,它将在引用该变量是一次性内嵌的变量全部展开。虽然这种方式很好的完成用户的指令,但有可能导致展开过程无穷循环,例如引用自己的时候:CFLAGS = $(CFLAGS) -O

递归展开的方式定义格式为:VAR=var。

简单展开的方式定义格式为:VAR:=var。

经变量替换后的makefile如下所示:


 1 OBJS = kang.o yul.o
2 CC = gcc
3 CFLAGS = -wall -o -g
4
5 sunq: $(OBJS)
6   $(CC) $(OBJS) -o sunq
7
8 kang.o: kang.c kang.h
9   $(CC) $(CFLAGS) -c kang.c -o kang.o
10
11 yul.o: yul.c yul.h
12   $(CC) $(CFLAGS) -c yul.c -o yul.o


Makefile中的变量分为用户自定义变量、预定义变量、自动变量和环境变量。上面的OBJS就是用户自定义变量。预定义变量包含了常见编译器、汇编器的名称以及编译选项。下面是makefile常见预定义变量

AR   库文件维护程序的名称
AS   汇编程序的名称
CC   C编译器的名称
CPP   C预编译器的名称
CXX   C++编译器的名称
ARFLAGS  库文件维护程序的选项
ASFLAGS  汇编程序的选项
CFLAGS  C编译器的选项
CPPFLAGS C预编译器的选项
CXXFLAGS C++编译器的选项


为了进一步简化makefile的编写,引入了自动变量。自动变量通常可以代表编译语句中出现的目标文件和依赖文件等。如下所示


$* 不包括扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
$% 如果目标时归档成员,则该变量表示目标的归档成员名称

这样上面的makefile文件就可以进一步简化为

1 OBJS = kang.o yul.o
2 CC = gcc
3 CFLAGS = -wall -o -g
4
5 sunq: $(OBJS)
6 $(CC) $^ -o $@
7
8 kang.o: kang.c kang.h
9 $(CC) $(CFLAGS) -c $< -o $@
10
11 yul.o: yul.c yul.h
12 $(CC) $(CFLAGS) -c $< -o $@


静态库与动态库的制作gcc

静态库过程如下:

(1) 进入libtest/lib目录,执行命令:

gcc -c -I../include hello.c

该命令生成目标文件hello.o,注意:参数-I添加头文件搜索目录,这里因为hello.c中有#include “hello.h”,hello.h在libtest/include目录中,这里需要指定该目录通知gcc,否则出现错误提示“找不到头文件hello.h”。

这一步将在libtest/lib目录中生成一个hello.o文件。

(2) 在libtest/lib目录,执行命令:

ar rc libhello.ahello.o

该命令将hello.o添加到静态库文件libhello.a,ar命令就是用来创建、修改库的,也可以从库中提出单个模块,参数r表示在库中插入或者替换模块,c表示创建一个库,关于ar命令的详细使用规则可以参考文章http://blog.csdn.net/xuhongning/article/details/6365200。

这一步将在libtest/lib目录中生成一个libhello.a文件。

(3) 进入libtest/src目录,执行命令:

gcc main.c-I../include -L../lib -lhello -o main

该命令将编译main.c并链接静态库文件libhello.a生成可执行文件main,注意:参数-L添加库文件搜索目录,因为libhello.a在libtest/lib目录中,这里需要指定该目录通知gcc,参数-l指定链接的库文件名称,名称不用写全名libhello.a,只用写hello即可。

这一步将在libtest/src目录中生成可执行文件main。


动态库过程如下:

(1) 进入libtest/lib目录,执行命令:

gcc hello.c-I../include -fPIC -shared -o libhello.so

这一步将在当前目录生成动态库文件libhello.so,参数-fPIC -shared固定格式,不用纠结他们什么意思。

(2) 进入libtest/src目录,执行命令:

gcc main.c-I../include -L../lib -lhello -o main

此时在当前目录中已经生成了可执行文件main,执行./main时却提示错误:

./main: error while loading shared libraries: libhello.so: cannotopen shared object file: No such file or directory

也就是找不到动态库文件libhello.so,在网上找了答案说如果遇到这样的问题需要设置环境变量LD_LIBRARY_PATH,如下:

export LD_LIBRARY_PATH=”../lib”

gcc main.c -I../include -L../lib -lhello -o main

然后再执行./main就没有错误了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值