多级目录makefile,静态库

作者&投稿:俎泽 (若有异议请与网页底部的电邮联系)
LInux 如何使用GCC编译器将一个文件夹下的100个.o文件打包成一个静态库文件(.a)~

你已经用gcc编译出目标文件了,用ar工具打包成.a文件就行了啊,示例:


如上图,假设我有test1.c,test2.c两个源文件,先使用gcc -c *.c将源文件编译成目标文件,可以看到,生成了test1.o,test2.o两个目标文件,然后,使用ar命令:ar crv libtest.a *.o将该目录下的所有目标文件打包生成了libtest.a文件。这样,你在编译的时候就可以直接使用这个静态库了。

下面是 Makefile.am中的代码,蓝色部分是一种扩展,将生成出来的静态库拷贝到lib目录:

noinst_LIBRARIES=libutil.a

libutil_a_SOURCES= util.c

all-am: $(all-am) CPLIBRARY

CPLIBRARY :
cp $(noinst_LIBRARIES) $(top_srcdir)/lib
上面代码虽然简单,但是非常实用,特别是要构筑大型的工程。

在lib 目录下编译需要生成动态库的文件,生成动态库,并安装到系统的标准库中,供
程序调用。具体步骤如下:
(1) 编写Makefile.am 文件
AUTOMAKE_OPTIONS=foreign
lib_LTLIBRARIES=libhello.la
libhello_la_SOURCES=test.c
这里lib_LTLIBRARIES 的意思是生成的动态库,然后指定动态库依赖的源文件
test.c ,若有多个源文件用空格隔开。
(2) 在lib 目录下,用命令autoscan 产生configure.scan 文件,并改名为configure.in。 这
里需加上宏AC_PROG_LIBTOOL,表示利用libtool 来自动生成动态库
#configure.in
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello,1.0, [miaoquan@nou.com.cn])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([test.c])
#AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_PROG_LIBTOOL
AC_CONFIG_FILES([Makefile])
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 文件
AUTOMAKE_OPTIONS=foreign
INCLUDES= -I../include
bin_PROGRAMS=hello
hello_SOURCES=hello.c
hello_LDADD=-lhello
-ldir 指定编译时搜索库的路径。与静态库不同的是,创建动态库时不用指定库路
径,编译器自动在标准库中查找libhello.so 文件。
(2) 执行autoscan 生成configure.scan 文件,将它重命名为configure.in 并修改其内容。
# configure.in
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello,1.0, [miaoquan@nou.com.cn])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.c])
#AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile])
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 ,简单的说,它的作用就是将/etc/ld.so.conf 列出的路径下的库
文件 缓存到/etc/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.c
gcc –shared –o libtt.so mylib.o
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的
任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不
是固定的。
-shared 作用于链接阶段,实际传递给链接器ld,让其添加作为共享库所需要的额外描
述信息,去除共享库所不需的信息。
也可以直接使用下面一条命令:
gcc –fPIC –shared –o libtt.so mylib.c
2. 将动态库拷贝到linux 的标准库中,usr/local/lib 或者/usr/lib 或者/lib:
cp libttt.so /usr/local/lib
3. 编译src 目录下的源程序时,指定动态库文件的目录,调用动态库中的函数
gcc –o test test.c /usr/lib/libttt.so
4. 设置shell 动态库搜索路径,运行生成的可执行文件。

当前的make生成了静态库以后,复制到上一层的某一个固定文件夹中。
上一层的makefile中直接使用这个固定文件夹中的.a文件就可以了。

使用automake工具是很方便的,同意这个观点,我之前有写一个博客,地址:http://www.cnblogs.com/iTsihang/archive/2012/12/01/2797011.html, 里面介绍了automake的使用,希望对你有帮助。


linux查看驱动是否安装linux查看驱动
4.查看网络接口队列数查看网卡接口的中断信息:#cat\/proc\/interrupts|grepeth0或#ethtool-Seth0;5.查看网卡驱动源码的版本号解压Intel网卡驱动源码,打开解压缩目录下的*.spec文件查看驱动的版本;linux加载驱动的两种makefile文件?二Makefile文件有两种写法:一种是:Addyourdebuggingflag(ornot)toCFLAG...

linux视频驱动框架linux视频驱动
(MAKE)-C$(KERNELDIR)M=$(PWD)modules endif 比较两者可以发现,该两个Makefi二Makefile文件有两种写法:一种是:Addyourdebuggingflag(ornot)toCFLAGS ifneq($(KERNELRELEASE),)obj-m:=boot.o else KERNELDIR?=\/lib\/modules\/$(shelluname-r)\/build PWD:=$(shellpwd)default:(MAKE)-C$(KERNEL...

求九年级上册人教新目标英语,单词和目录 (第一个单词是textbook)最好照...
Unit 1 How can we become good learners?textbook \/tekstbUk\/ n. 教科书;课本 p.1 conversation \/kQnv@seISn\/,\/kA:nv@rseISn\/ n. 交谈;谈话 p.2 aloud \/@laUd\/ adv. 大声地;出声地 p.2 pronunciation \/pr@nVnsieISn\/ n. 发音;读音p.2 sentence \/sent@ns\/ n. 句子 ...

linux系统可以用无线网卡吗
可以 linux作为当今市场上嵌入式系统使用比例最高的操作系统,其驱动模式支持模块堆叠技术,内核开发者已提供了一些通用模块。现从工程应用出发,研究并移植了linux下usb无线网卡的设备驱动,以此为基础既可以构建嵌入式无线局域网,又可以用于有线网络无法延伸或难以安装,以及有可灵活移动和临时性使用等要求的...

docker容器内怎么连接外部的mysql
# ADD: 添加本地文件到容器中,如果是压缩包会在目标目录进行自动解压,如果只想添加文件可以使用 COPY命令 ADD .\/supervisord.conf \/etc\/supervisord.conf ADD .\/cmake-3.2.2.tar.gz \/root\/tools\/ ADD .\/mysql-5.6.24.tar.gz \/root\/tools\/ ADD .\/install_mysql-5.6.24.sh \/root\/tools...

玛曲县15155514799: 多级目录makefile,静态库 -
原怖英特: 在lib 目录下编译需要生成动态库的文件,生成动态库,并安装到系统的标准库中,供 程序调用.具体步骤如下:(1) 编写Makefile.am 文件 AUTOMAKE_OPTIONS=foreign lib_LTLIBRARIES=libhello.la libhello_la_SOURCES=test.c 这里lib_...

玛曲县15155514799: 怎么编写Makefile生成静态库 -
原怖英特: 编写Makefile生成静态库的方法:方法一////////////////////////////////////////////////////////////////// divFIX=/usr LIBDIR=$(divFIX)/lib INCLUDEDIR=$(divFIX)/include#$(DESTDIR) is usally empty. rpmbuild needs it.DESTDIR= CC=gcc CFLAGS= LIBS= INCLUDES= ...

玛曲县15155514799: makefile如何链接静态库 -
原怖英特: makefile 里面写法,同你的编译器 如何链接静态库的方法有关.例如:指定库名 VC++ 用 编译选项 /MT 链接 LIBCMT.LIB 就是 链接静态库.----- unix/linux makefile 里面,例如 LIBS = libmine.a -lpthread 这里写你要链接的静态库库名 CXXFILES ...

玛曲县15155514799: 多级目录中存在多个makefile时,编译的顺序如何 -
原怖英特: 一般来说,如果存在多级目录,那么再用makefile的时候,最好在每个目录下也写一个简单的子makefile,这样在总目录下写一个总的makefile,然后再总的makefile中调用子makefile,这样写起来就会比较清晰,编译顺序是要看你的总makefile中的步骤.另外,如果你写好之后,你也可以make -n一下,这样也就可以看出make的编译顺序了!也是刚开始学习makefile,共勉!

玛曲县15155514799: 请教编写Makefile 静态库
原怖英特: 就这么几个目录,Makefile 直接手写先生成 .O文件,再打包成静态库. 或者在A目录下写一个make.rule, 子目录include这个文件.使用第三方静态库是,只要在链接时注意顺序就好了.

玛曲县15155514799: makefile 生成动态库和静态库的区别
原怖英特: 生成动态库的时候要注意,编译生成目标文件的时候加上-fPIC参数,生成位置无关的可重定位代码,然后链接的时候加上-shared生成动态共享库.比如一个hello.c,生成静态库:12 gcc -o hello.o -c hello.car rcs libhello.a hello.o 生成动态库的命令:12 gcc -fPIC hello.o -c hello.cgcc -shared -o libhelllo.so hello.o 还有一个区别是:静态库参与链接过程,而动态库不链接到可执行文件中,可执行程序在运行的时候,对应的动态库也要加载到内存中,否则可执行程序运行不了.

玛曲县15155514799: 根据提供的Linux 操作系统源码中Makefile 结构,分析在工程中多级目录中存在着多个makefile 时,编译的顺 -
原怖英特: 多级目录的编译顺序也是有Makefile控制的, 如下这个例子(3个子目录, 一个Makefile), 子目录的编译顺序由这个Makefile控制. sub_a sub_b sub_c Makefile

玛曲县15155514799: 根据提供的Linux操作系统源码中的Makefile结构,分析在工程多级目录中存在多个makefile文件时编译的顺序如
原怖英特: 如下这个例子(3个子目录, 一个Makefile), 子目录的编译顺序由这个Makefile控制.sub_a sub_b sub_c Makefile

玛曲县15155514799: 怎样用ar命令将库文件释放到指定路径下 -
原怖英特: 用途说明创建静态库.a文件.用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚 本中用到.关于Linux下的库文件、静态库、动态库以及怎样创建和使用等相关知识,参见本文后面的...

玛曲县15155514799: 在linux下写makefile时,如何链接一个静态库? -
原怖英特: 从错误信息上看,你引用了”/src/makedir.mkinc“文件,应该是引用路径不对. 检查一下你的path_project_common定义的是什么,感觉是被定义到了”/”.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网