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

上传人:豆**** 文档编号:24018350 上传时间:2022-07-03 格式:DOC 页数:38 大小:188KB
返回 下载 相关 举报
使用Automake生成Makefile及动态库和静态库的创建.doc_第1页
第1页 / 共38页
使用Automake生成Makefile及动态库和静态库的创建.doc_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《使用Automake生成Makefile及动态库和静态库的创建.doc》由会员分享,可在线阅读,更多相关《使用Automake生成Makefile及动态库和静态库的创建.doc(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date使用Automake生成Makefile及动态库和静态库的创建使用Automake生成Makefile及动态库和静态库的创建使用Automake生成Makefile及动态库和静态库的创建使用Automake 创建和使用静态库1. 目录结构如下:c-sharpview plaincopy1. example2. |src目录(存放源代码文件)3. |hello.c4.

2、|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(“Hellostaticl

3、ibrary!”);/这里用到的是静态库中的函数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)

4、。第三行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

5、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-sha

6、rpview 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-sharpv

7、iew 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,structure

8、s,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_OU

9、TPUT(FILE)设置 configure 所要产生的文件,若是Makefile ,configure 便会把它检查出来的结果填充到Makefile.in 文件后产生合适的 Makefile。 后面的FILE 是一个Makefile 的输出列表,你可以选着将要输出的Makefile 的位置和个数。建议只在src 中输出Makefile。在lib 目录下依次执行 aclocal 、autoconf、automake -add-missing、./configure、make,此时在该目录下就可以看到生成的静态库文件libhello.a6. 在src 目录下,执行autoscan 生成confi

10、gure.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. #Checksforheaderfi

11、les.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

12、 文件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)

13、;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. o

14、utstring(“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目录(存放程序中

15、使用的头文件)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 目录下编译需要生成动态库的文

16、件,生成动态库,并安装到系统的标准库中,供程序调用。具体步骤如下:(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_

17、LIBTOOL,表示利用libtool 来自动生成动态库c-sharpview plaincopy1. #configure.in2. #Processthisfilewithautoconftoproduceaconfigurescript.3. AC_PREREQ(2.59)4. AC_INIT(hello,1.0,miaoquan)5. AM_INIT_AUTOMAKE6. AC_CONFIG_SRCDIR(test.c)7. #AC_CONFIG_HEADER(config.h)8. #Checksforprograms.9. AC_PROG_CC10. #Checksforheade

18、rfiles.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)。注:libt

19、oolize 提供了一种标准的方式来将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 指定编译时搜索库的路径。与静态库不同的是,创建

20、动态库时不用指定库路径,编译器自动在标准库中查找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,miaoquan)5. AM_INIT_AUTOMAKE6. AC_CONFIG_SRCDIR(hello.c)7. #AC_CONF

21、IG_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、./c

22、onfigure、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/

23、lib)(2) 修改/etc/ld.so.conf 文件,加入搜索路径,修改后用ldconfig 命令载入修改。将自己可能存放库文件的路径都加入到/etc/ld.so.conf 中是明智的选择 _。添加方法也极其简单,将库文件的绝对路径直接写进去就OK 了,一行一个。例如:/usr/local/lib/usr/lib/lib需要注意的是:这种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是 因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.ca

24、che 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由/sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache文件之后才可以。ldconfig ,简单的说,它的作用就是将/etc/ld.so.conf 列出的路径下的库文件 缓存到/e

25、tc/ld.so.cache 以供使用。因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf 增加新的库路径后,需要运行一下/sbin/ldconfig 使所有的库文件都被缓存到ld.so.cache 中,如果没做,即使库文件明明就在/usr/lib 下的,也是不会被使用的,结果编译过程中报错,缺少xxx 库,去查看发现明明就在那放着,搞的想大骂computer 蠢猪一个_。极力推荐使用这种方法!利用gcc 创建和使用动态库1. 用下面的命令将mylib.c 程序创建成一个动态库:gcc fPIC o mylib.o c mylib.cgcc shared o lib

26、tt.so mylib.o-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。-shared 作用于链接阶段,实际传递给链接器ld,让其添加作为共享库所需要的额外描述信息,去除共享库所不需的信息。也可以直接使用下面一条命令:gcc fPIC shared o libtt.so mylib.c2. 将动态库拷贝到linux 的标准库中,usr/local/lib 或者/usr/lib 或者/lib:cp libttt.so /usr/local/lib3. 编译src 目录下的源程序时,指定动态库文件的目录,调用动态库中的函数gcc o test test.c /usr/lib/libttt.so4. 设置shell 动态库搜索路径,运行生成的可执行文件-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁