使用Automake生成Makefile及动态库和静态库的创建.doc_第1页
使用Automake生成Makefile及动态库和静态库的创建.doc_第2页
使用Automake生成Makefile及动态库和静态库的创建.doc_第3页
使用Automake生成Makefile及动态库和静态库的创建.doc_第4页
使用Automake生成Makefile及动态库和静态库的创建.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用Automake生成Makefile及动态库和静态库的创建使用Automake 创建和使用静态库1. 目录结构如下:c-sharpview plaincopy1. example2. |src目录(存放源代码文件)3. |hello.c4. |lib目录(存放用来生成库的文件)5. |test.c用来生成静态库libhello.a6. |include目录(存放程序中使用的头文件)7. |hello.h2. 编写的各个目录下的源文件c-sharpview plaincopy1. hello.h文件2. externvoidprint(char*);3. test.c文件4. #include5. voidprint(char*msg)6. 7. print(“%s/n”,msg);8. 9. hello.c文件10. #include“hello.h”11. intmain()12. 13. print(“Hellostaticlibrary!”);/这里用到的是静态库中的函数14. return0;15. 3. 编写lib/Makefile.am 文件c-sharpview 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-sharpview 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-sharpview 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-sharpview plaincopy1. #configure.in2. #Processthisfilewithautoconftoproduceaconfigurescript.3. AC_PREREQ(2.59)4. AC_INIT(libhello.a,1.1,)5. AM_INIT_AUTOMAKE6. #Checksforprograms.7. AC_PROG_CC8. #Checksforlibraries.9. AC_PROG_RANLIB/需要加入的内容,因为使用了静态库10. #Checksforheaderfiles.11. #Checksfortypedefs,structures,andcompilercharacteristics.12. #Checksforlibraryfunctions.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-sharpview plaincopy1. #configure.in2. #Processthisfilewithautoconftoproduceaconfigurescript.3. AC_PREREQ(2.59)4. AC_INIT(hello,1.1,)5. AM_INIT_AUTOMAKE6. AC_CONFIG_SRCDIR(hello.c)7. #Checksforprograms.8. AC_PROG_CC9. #Checksforlibraries.10. #Checksforheaderfiles.11. #Checksfortypedefs,structures,andcompilercharacteristics.12. #Checksforlibraryfunctions.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-sharpview plaincopy1. #ifndef_mylib_h_2. #define_mylib_h_3. voidwelcome();4. voidoutstring(constchar*str);5. #endif2. 编写mylib.c 文件,用来生成静态库。c-sharpview plaincopy1. #include2. voidwelcome()3. 4. printf(“welcometolibmylib/n”);5. 6. voidoutstring(constchar*str)7. 8. if(str!=NULL)9. printf(“%s”,str);10. 3. 编译源文件,产生目标代码gcc o mylib.o c mylib.c4. 将上面产生的目标文件加入到静态库中,并把静态库拷贝到系统默认的路径c-sharpview plaincopy1. arrcslibmylib.amylib.o2. cplibmylib.a/usr/lib/5. 编写测试程序来使用刚才创建的静态库 libmylib.ac-sharpview plaincopy1. #include“mylib.h”2. #include3. Intmain()4. 5. printf(“createanduselibrary:/n”);6. welcome();7. outstring(“Itsasuccessful/n”);8. 6. 编译使用库函数的程序c-sharpview plaincopy1. gccotesttest.c-lmylib运行./test 查看结果。使用Automake 创建和使用动态库动态库与静态库的差别在于:动态库是在程序执行的时候加载到内存,供调用函数使用。1. 目录结构如下:c-sharpview plaincopy1. example2. |src目录(存放源代码文件)3. |hello.c4. |lib目录(存放用来生成库的文件)5. |test.c用来生成动态库libhello.la6. |include目录(存放程序中使用的头文件)7. |hello.h2. 编写各个目录下的源文件如下:c-sharpview plaincopy1. hello.h文件2. externvoidprint(char*);3. test.c文件4. #include5. voidprint(char*msg)6. 7. print(“%s/n”,msg);8. 9. hello.c文件10. #include“hello.h”11. intmain()12. 13. print(“Hellostaticlibrary!”);/这里用到的是动态库中的函数14. return0;15. 3. 在lib 目录下编译需要生成动态库的文件,生成动态库,并安装到系统的标准库中,供程序调用。具体步骤如下:(1) 编写Makefile.am 文件c-sharpview plaincopy1. AUTOMAKE_OPTIONS=foreign2. lib_LTLIBRARIES=libhello.la3. libhello_la_SOURCES=test.c这里lib_LTLIBRARIES 的意思是生成的动态库,然后指定动态库依赖的源文件test.c ,若有多个源文件用空格隔开。(2) 在lib 目录下,用命令autoscan 产生configure.scan 文件,并改名为configure.in。 这里需加上宏AC_PROG_LIBTOOL,表示利用libtool 来自动生成动态库c-sharpview plaincopy1. #configure.in2. #Processthisfilewithautoconftoproduceaconfigurescript.3. AC_PREREQ(2.59)4. AC_INIT(hello,1.0,)5. AM_INIT_AUTOMAKE6. AC_CONFIG_SRCDIR(test.c)7. #AC_CONFIG_HEADER(config.h)8. #Checksforprograms.9. AC_PROG_CC10. #Checksforheaderfiles.11. #Checksfortypedefs,structures,andcompilercharacteristics.12. #Checksforlibraryfunctions.13. AC_PROG_LIBTOOL14. AC_CONFIG_FILES(Makefile)15. AC_OUTPUT(3) 执行命令aclocal、libtoolize -f -c 、autoconf、automake -add-missing、./configure、make、make install 将动态库安装到系统的标准库中,以供调用(一般为/usr/local/lib)。注:libtoolize 提供了一种标准的方式来将libtool 支持加入一个软件包,而GNU libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中。4. 生成src 目录下的hello 可执行文件(1) 编写src/Makefile.am 文件c-sharpview plaincopy1. AUTOMAKE_OPTIONS=foreign2. INCLUDES=-I./include3. bin_PROGRAMS=hello4. hello_SOURCES=hello.c5. hello_LDADD=-lhello-ldir 指定编译时搜索库的路径。与静态库不同的是,创建动态库时不用指定库路径,编译器自动在标准库中查找libhello.so 文件。(2) 执行autoscan 生成configure.scan 文件,将它重命名为configure.in 并修改其内容。c-sharpview plaincopy1. #configure.in2. #Processthisfilewithautoconftoproduceaconfigurescript.3. AC_PREREQ(2.59)4. AC_INIT(hello,1.0,)5. AM_INIT_AUTOMAKE6. AC_CONFIG_SRCDIR(hello.c)7. #AC_CONFIG_HEADER(config.h)8. #Checksforprograms.9. AC_PROG_CC10. #Checksforheaderfiles.11. #Checksfortypedefs,structures,andcompilercharacteristics.12. #Checksforlibraryfunctions.13. AC_CONFIG_FILES(Makefile)14. AC_OUTPUT(3) 在src 目录下编译并生成目标文件,执行命令aclocal、libtoolize -f -c 、autoconf、automake -add-missing、./configure、make,此时你一定会觉得,成功近在咫尺了。再执行目标文件./hello,结果却在你的意料之外:./hello: error while loading shared libraries: libhello.so.0 : cannot open shared object file:No such file or directory在执行目标文件的时候,Shell 找不到共享库的位置,需要我们手工载入库路径。5. shell 搜索动态库路径位置的两种方法(1) 使用命令导入动态库的路径,命令如下:export LD_LIBRARY_PATH=dir (如/usr/local/lib)(2) 修改/etc/ld.so.conf 文件,加入搜索路径,修改后用ldconfig 命令载入修改。将自己可能存放库文件的路径都加入到/etc/ld.so.conf 中是明智的选择 _。添加方法也极其简单,将库文件的绝对路径直接写进去就OK 了,一行一个。例如:/usr/local/lib/usr/lib/lib需要注意的是:这种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是 因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由/sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache文件之后才可以。ldconfig ,简单的说,它的作用就是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论