使用Automake生成Makefile及动态库和静态库的创建.doc
《使用Automake生成Makefile及动态库和静态库的创建.doc》由会员分享,可在线阅读,更多相关《使用Automake生成Makefile及动态库和静态库的创建.doc(9页珍藏版)》请在冰豆网上搜索。
使用Automake生成Makefile及动态库和静态库的创建
使用Automake创建和使用静态库
1.目录结构如下:
[c-sharp] viewplaincopy
1.example
2.|——src 目录(存放源代码文件)
3. |——hello.c
4.|——lib 目录(存放用来生成库的文件)
5. |——test.c 用来生成静态库libhello.a
6.|——include 目录(存放程序中使用的头文件)
7. |——hello.h
2.编写的各个目录下的源文件
[c-sharp] viewplaincopy
1.hello.h 文件
2.extern void print(char *);
3.test.c 文件
4.#include
5.void print(char *msg)
6.{
7.print(“%s/n”, msg);
8.}
9.hello.c 文件
10.#include “hello.h”
11.int main()
12.{
13.print(“Hello static library!
”);//这里用到的是静态库中的函数
14.return 0;
15.}
3.编写lib/Makefile.am文件
[c-sharp] viewplaincopy
1.noinst_LIBRARIES=libhello.a
2.libhello_a_SOURCES=test.c
3.AUTOMAKE_OPTIONS=foreign
第一行noinst表示生成的是静态库,不需要makeinstall,直接制定它的位置和名字就
可以使用。
第二行表示用来生成静态库的源文件。
如果要把静态库生成到其他地方,可以在=后面
加上路径(建议用绝对路径,并将所要用到的静态库生成在同一个文件夹下,如lib)。
第三行AUTOMAKE_OPTIONS是Automake的选项。
Automake主要是帮助开发GNU软
件的人员来维护软件,所以在执行Automake时,会检查目录下是否存在标准GNU软件中
应具备的文件,例如'NEWS'、'AUTHOR'、'ChangeLog'等文件。
设置为foreign时,Automake
会改用一般软件的标准来检查。
如果不加这句的话,需要在autoconf之前,先执行touchNEWS
READMEAUTHORSChangeLog来生成'NEWS'、'AUTHOR'、'ChangeLog'等文件
4.编写src/Makefile.am文件
[c-sharp] viewplaincopy
1.AUTOMAKE_OPTIONS=foreign
2.INCLUDES= -I../include
3.bin_PROGRAMS=hello
4.hello_SOURCES=hello.c
5.hello_LDADD=../lib/libhello.a
第二行指定头文件的位置,-I是idirafter的缩写。
../include指定头文件的位置,..是上
一级目录,也就是这里的example目录。
第三行指定生成可执行文件名hello,在这里可执行文件生成在src下,建议将可执行文
件生成到一个特定的文件夹下,让它和源代码分开,如/root/test目录下。
写法为:
[c-sharp] viewplaincopy
1.bin_PROGRAMS=/root/test/hello,后面的第四、五行也相对应地变为:
2._root_test_hello_SOURCES=hello.c
3._root_test_hello_LDADD=../lib/libhello.a
第四行指定生成可执行文件hello的源代码文件,如果hello.c在其他目录下,需要加上
完整的路径。
第五行指定需要使用静态库的位置。
5.生成静态库文件lib/libhello.a。
执行autoscan生成configure.scan文件,将它重命名为configure.in并修改其内容。
[c-sharp] viewplaincopy
1.#configure.in
2.# Process this file with autoconf to produce a configure script.
3.AC_PREREQ(2.59)
4.AC_INIT(libhello.a,1.1,[])
5.AM_INIT_AUTOMAKE
6.# Checks for programs.
7.AC_PROG_CC
8.# Checks for libraries.
9.AC_PROG_RANLIB//需要加入的内容,因为使用了静态库
10.# Checks for header files.
11.# Checks for typedefs, structures, and compiler characteristics.
12.# Checks for library functions.
13.AC_OUTPUT([Makefile])
14.AC_INIT(FILE)
该宏用来检查源代码所在路径,autoscan会自动产生,一般无须修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION)
这个是使用Automake所必备的宏,PACKAGE是所要产生软件的名称,VERSION是版
本编号。
也可以把包和版本号等信息放在AC_INIT(FILE)宏里。
AC_PROG_CC
检查系统可用的C编译器,若源代码是用C写的就需要这个宏。
AC_OUTPUT(FILE)
设置configure所要产生的文件,若是Makefile,configure便会把它检查出来的结果
填充到Makefile.in文件后产生合适的Makefile。
后面的FILE是一个Makefile的输出列表,
你可以选着将要输出的Makefile的位置和个数。
建议只在src中输出Makefile。
在lib目录下依次执行aclocal、autoconf、automake--add-missing、./configure、make,
此时在该目录下就可以看到生成的静态库文件libhello.a
6.在src目录下,执行autoscan生成configure.scan文件,将它重命名为configure.in并修
改其内容。
[c-sharp] viewplaincopy
1.#configure.in
2.# Process this file with autoconf to produce a configure script.
3.AC_PREREQ(2.59)
4.AC_INIT(hello,1.1,[])
5.AM_INIT_AUTOMAKE
6.AC_CONFIG_SRCDIR([hello.c])
7.# Checks for programs.
8.AC_PROG_CC
9.# Checks for libraries.
10.# Checks for header files.
11.# Checks for typedefs, structures, and compiler characteristics.
12.# Checks for library functions.
13.AC_OUTPUT([Makefile])
7.在src目录下依次执行aclocal、autoconf、automake--add-missing、./configure、make,
生成可执行文件hello
8.执行makeinstall进行安装,最后输入hello来运行程序,查看效果:
Hellostaticlibrary!
执行成功!
使用gcc创建和使用静态库
1.编写mylib.h文件
[c-sharp] viewplaincopy
1.#ifndef _mylib_h_
2.#define _mylib_h_
3.void welcome();
4.void outstring(const char * str);
5.#endif
2.编写mylib.c文件,用来生成静态库。
[c-sharp] viewplaincopy
1.#include
2.void welcome()
3.{
4.printf(“welcome to libmylib/n”);
5.}
6.void outstring(const char * str)
7.{
8.if(str!
=NULL)
9.printf(“%s”,str);
10.}
3.编译源文件,产生目标代码
gcc–omylib.o–cmylib.c
4.将上面产生的目标文件加入到静态库中,并把静态库拷贝到系统默认的路径
[c-sharp] viewplaincopy
1.ar rcs libmylib.a mylib.o
2.cp libmylib.a /usr/lib/
5.编写测试程序来使用刚才创建的静态库libmylib.a
[c-sharp] viewplaincopy
1.#include “mylib.h”
2.#include
3.Int main()
4.{
5.printf(“create and use library:
/n”);
6.welcome();
7.outstring(“It’s a successful/n”);
8.}
6.编译使用库函数的程序
[c-sharp] viewplaincopy
1.gcc –o test test.c -lmylib
运行./test查看结果。
使用Automake创建和使用动态库
动态库与静态库的差别在于:
动态库是在程序执行的时候加载到内存,供调用函数使用。
1.目录结构如下:
[c-sharp] viewplaincopy
1.example
2.|——src 目录(存放源代码文件)
3.|——hello.c
4.|——lib 目录(存放用来生成库的文件)
5.|——test.c 用来生成动态库libhello.la
6.|——include 目录(存放程序中使用的头文件)
7.|——hello.h
2.编写各个目录下的源文件如下:
[c-sharp] viewplaincopy
1.hello.h 文件
2.extern void print(char *);
3.test.c 文件
4.#include