当前位置:文档之家› 使用Automake生成Makefile及动态库和静态库的创建

使用Automake生成Makefile及动态库和静态库的创建

使用Automake生成Makefile及动态库和静态库的创建使用Automake 创建和使用静态库1. 目录结构如下:[c-sharp]view plaincopy1.example2.|——src 目录(存放源代码文件)3. |——hello.c4.|——lib 目录(存放用来生成库的文件)5. |——test.c 用来生成静态库libhello.a6.|——include 目录(存放程序中使用的头文件)7. |——hello.h2. 编写的各个目录下的源文件[c-sharp]view plaincopy1.hello.h 文件2.extern void print(char *);3.test.c 文件4.#include<stdio.h>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]view plaincopy1.noinst_LIBRARIES=libhello.a2.libhello_a_SOURCES=test.c3.AUTOMAKE_OPTIONS=foreign第一行noinst 表示生成的是静态库,不需要make install ,直接制定它的位置和名字就可以使用。

第二行表示用来生成静态库的源文件。

如果要把静态库生成到其他地方,可以在=后面加上路径(建议用绝对路径,并将所要用到的静态库生成在同一个文件夹下,如lib)。

第三行AUTOMAKE_OPTIONS 是Automake 的选项。

Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准GNU 软件中应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。

设置为foreign 时,Automake会改用一般软件的标准来检查。

如果不加这句的话,需要在autoconf之前,先执行touch NEWSREADME AUTHORS ChangeLog 来生成'NEWS'、'AUTHOR'、 'ChangeLog' 等文件4. 编写src/Makefile.am 文件[c-sharp]view plaincopy1.AUTOMAKE_OPTIONS=foreign2.INCLUDES= -I../include3.bin_PROGRAMS=hello4.hello_SOURCES=hello.c5.hello_LDADD=../lib/libhello.a第二行指定头文件的位置,-I 是idirafter 的缩写。

../include 指定头文件的位置,..是上一级目录,也就是这里的example 目录。

第三行指定生成可执行文件名hello,在这里可执行文件生成在src 下,建议将可执行文件生成到一个特定的文件夹下,让它和源代码分开,如/root/test 目录下。

写法为:[c-sharp]view plaincopy1.bin_PROGRAMS=/root/test/hello,后面的第四、五行也相对应地变为:2._root_test_hello_SOURCES=hello.c3._root_test_hello_LDADD=../lib/libhello.a第四行指定生成可执行文件hello 的源代码文件,如果hello.c 在其他目录下,需要加上完整的路径。

第五行指定需要使用静态库的位置。

5. 生成静态库文件lib/libhello.a。

执行autoscan 生成configure.scan 文件,将它重命名为configure.in 并修改其内容。

[c-sharp]view plaincopy1.#configure.in2.# 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_AUTOMAKE6.# Checks for programs.7.AC_PROG_CC8.# 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.a6. 在src 目录下,执行autoscan 生成configure.scan 文件,将它重命名为configure.in 并修改其内容。

[c-sharp]view plaincopy1.#configure.in2.# Process this file with autoconf to produce a configure script.3.AC_PREREQ(2.59)4.AC_INIT(hello,1.1,[])5.AM_INIT_AUTOMAKE6.AC_CONFIG_SRCDIR([hello.c])7.# Checks for programs.8.AC_PROG_CC9.# 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,生成可执行文件hello8. 执行make install 进行安装,最后输入hello 来运行程序,查看效果:Hello static library!执行成功!使用gcc 创建和使用静态库1. 编写mylib.h 文件[c-sharp]view plaincopy1.#ifndef _mylib_h_2.#define _mylib_h_3.void welcome();4.void outstring(const char * str);5.#endif2. 编写mylib.c 文件,用来生成静态库。

[c-sharp]view plaincopy1.#include <stdio.h>2.void welcome()3.{4.p rintf(“welcome to libmylib/n”);5.}6.void outstring(const char * str)7.{8.if(str!=NULL)9.printf(“%s”,str);10.}3. 编译源文件,产生目标代码gcc –o mylib.o –c mylib.c4. 将上面产生的目标文件加入到静态库中,并把静态库拷贝到系统默认的路径[c-sharp]view plaincopy1.ar rcs libmylib.a mylib.o2.cp libmylib.a /usr/lib/5. 编写测试程序来使用刚才创建的静态库 libmylib.a[c-sharp]view plaincopy1.#include “mylib.h”2.#include <stdio.h>3.Int main()4.{5.printf(“create and use library:/n”);6.welcome();7.outstring(“It’s a successful/n”);8.}6. 编译使用库函数的程序[c-sharp]view plaincopy1.gcc –o test test.c -lmylib运行./test 查看结果。

使用Automake 创建和使用动态库动态库与静态库的差别在于:动态库是在程序执行的时候加载到内存,供调用函数使用。

1. 目录结构如下:[c-sharp]view plaincopy1.example2.|——src 目录(存放源代码文件)3.|——hello.c4.|——lib 目录(存放用来生成库的文件)5.|——test.c 用来生成动态库6.|——include 目录(存放程序中使用的头文件)7.|——hello.h2. 编写各个目录下的源文件如下:[c-sharp]view plaincopy1.hello.h 文件2.extern void print(char *);3.test.c 文件4.#include<stdio.h>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 目录下编译需要生成动态库的文件,生成动态库,并安装到系统的标准库中,供程序调用。

相关主题