多级目录makefile-静态库 (多级目录结构中,对文件的访问)

公司代码 2024-12-19 04:27:14 浏览
多级目录makefile

在lib 目录下编译需要生成动态库的文件,生成动态库,并安装到系统的标准库中,供程序调用。

具体步骤如下:(1) 编写 文件AUTOMAKE_OPTIONS=foreignlib_LTLIBRARIES=_la_SOURCES=test.c这里lib_LTLIBRARIES 的意思是生成的动态库,然后指定动态库依赖的源文件test.c ,若有多个源文件用空格隔开。

(2) 在lib 目录下,用命令autoscan 产生 文件,并改名为。

这里需加上宏AC_ProG_LIBTOOL,表示利用libtool 来自动生成动态库## Process this file with autoconf to produce a configure _PREREQ(2.59)AC_INIT(hello,1.0, [])AM_INIT_AUTOMAKEAC_CONFIG_SRCDIR([test.c])#AC_CONFIG_HEADER([config.h])# Checks for _PROG_CC# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library _PROG_LIBTOOLAC_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/ 文件AUTOMAKE_OPTIONS=foreignINCLUDES= -I../includebin_PROGRAMS=hellohello_SOURCES=_LDADD=-lhello-ldir 指定编译时搜索库的路径。

与静态库不同的是,创建动态库时不用指定库路径,编译器自动在标准库中查找 文件。

(2) 执行autoscan 生成 文件,将它重命名为 并修改其内容。

# # Process this file with autoconf to produce a configure _PREREQ(2.59)AC_INIT(hello,1.0, [])AM_INIT_AUTOMAKEAC_CONFIG_SRCDIR([hello.c])#AC_CONFIG_HEADER([config.h])# Checks for _PROG_CC# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library _CONFIG_FILES([Makefile])AC_OUTPUT(3) 在src 目录下编译并生成目标文件,执行命令aclocal、libtoolize -f -c 、autoconf、automake --add-missing、./configure、make,此时你一定会觉得,成功近在咫尺了。

再执行目标文件./hello,结果却在你的意料之外:./hello: error while loading shared libraries: .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/ 文件,加入搜索路径,修改后用ldconfig 命令载入修改。

将自己可能存放库文件的路径都加入到/etc/ 中是明智的选择 ^_^。

添加方法也极其简单,将库文件的绝对路径直接写进去就OK 了,箭头替换。

例如:/usr/local/lib/usr/lib/lib需要注意的是:这种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。

这是 因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ 从中进行搜索的。

/etc/ 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ 中设置的搜索路径由/sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。

因此,为了保证程序执行时对库的定位,在 /etc/ 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/文件之后才可以。

ldconfig ,简单的说,它的作用就是将/etc/ 列出的路径下的库文件 缓存到/etc/ 以供使用。

因此当安装完一些库文件,(例如刚安装好glib),或者修改 增加新的库路径后,需要运行一下/sbin/ldconfig 使所有的库文件都被缓存到 中,如果没做,即使库文件明明就在/usr/lib 下的,也是不会被使用的,结果编译过程中报错,缺少xxx 库,去查看发现明明就在那放着,搞的想大骂computer 蠢猪一个^_^。

极力推荐使用这种方法!利用gcc 创建和使用动态库1. 用下面的命令将mylib.c 程序创建成一个动态库:gcc –fPIC –o mylib.o –c –shared –o mylib.o-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。

这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

-shared 作用于链接阶段,实际传递给链接器ld,让其添加作为共享库所需要的额外描述信息,去除共享库所不需的信息。

也可以直接使用下面一条命令:gcc –fPIC –shared –o mylib.c2. 将动态库拷贝到linux 的标准库中,usr/local/lib 或者/usr/lib 或者/lib:cp /usr/local/lib3. 编译src 目录下的源程序时,指定动态库文件的目录,调用动态库中的函数gcc –o test test.c /usr/lib/4. 设置shell 动态库搜索路径,运行生成的可执行文件。

CMake构建静态库与动态库以及使用

用例子的方式通俗易懂地解释CMake构建静态库与动态库的过程。

任务:用实际操作解释CMake如何构建静态库和动态库。

准备工作

编译共享库:

采用out-of-source 编译方法,建立build目录,在build目录下执行构建命令,生成共享库。

如果需要调整输出位置,修改主工程文件中的指令,或在lib/中添加SET(LIBRARY_OUTPUT_PATH)指令。

ADD_LIBRARY指令:

无需填写全路径,仅输入库名,CMake系统会自动生成库文件名。

提供三种类型,包含EXCLUDE_FROM_ALL参数以避免默认构建。

编译静态库:

静态库文件名应与动态库一致,仅后缀不同。

使用ADD_LIBRARY指令添加静态库时,若在动态库编译基础上执行,静态库构建失败。

修改为hello_static,构建libhello_static.a静态库。

通过SET_TARGET_PROPERTIES指令设置输出名称、版本号和API版本,实现同时生成和libhello.a库。

动态库版本号:

动态库应包含版本号,使用SET_TARGET_PROPERTIES指令配置,具体使用方法在lib/中添加相应代码。

安装共享库和头文件:

将libhello.a、和hello.h安装到系统目录,如将hello共享库安装到/lib目录,将hello.h安装到/include/hello目录,使用INSTALL指令实现。

使用外部共享库和头文件:

建立t4目录及src目录,编写main.c源文件和文件,通过INCLUDE_DIRECTORIES指令引入头文件搜索路径,使用LINK_DIRECTORIES和TARGET_LINK_LIBRARIES指令链接共享库,完成可执行文件构建。

使用外部静态库:

链接静态库方法与动态库类似,使用TARGET_LINK_LIBRARIES指令替换动态库链接指令,实现静态库链接。

环境变量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH的使用:

通过环境变量调整头文件和库文件搜索路径,确保非标准路径中的文件能够被正确识别和链接。

总结:通过实际操作和配置,深入理解CMake在构建静态库与动态库过程中的应用,以及如何通过环境变量优化构建过程。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

热门推荐