• 第四章 如何生成动态、静态链接库并使用


    第四章 如何生成动态、静态链接库并使用

    一、如何生成动态链接库并使用

    1、生成动态链接库

    在第三章创建的project1工程里面把main.cpp的main函数名更名为maina。

    打开project1.pro,将TEMPLATE = app改为TEMPLATE = lib。

    执行“qmake”生产新的Makefile,再执行“make”编译。

    编译过程中用ln指令生产了动态链接库的软链接文件。make编译工程时,就执行“ln -s”建立指向libproject1.so.1.0.0的3个软链接文件(libproject1.so,libproject1.so.1和libproject1.so.1.0)。程序在链接动态库时,默认搜索“.so”后缀的文件,因而为了能使用这些库,需要建立指向它们的软链接(链接名以.so为后缀),这就是工程编译的时候建立软链接的意义。

    2、使用动态链接库

    当第三方程序链接库libproject1.so时,调用maina即可绘制出一个软件界面。细节都在库中实现了,使用者只需调用接口。执行下面指令:

    在mylib.h输入以下代码保存

    库和库的接口定义文件都齐备了,接下来在testlib目录下编写使用这个库的测试代码test.cpp,内容如下:

    最后就是编译测试

    "-I"来指定库的头文件搜索路径;“-L”指定动态库所在的路径;“-lproject1”告诉编译器具体找哪个库,注意:我们写的是“-lproject1”,并不是“-llibproject1”,能这样写也是因为Linux对动态链接库命名的偏好(必须以“lib”3个字母开头)引起的。在用“-l”指定要链接的库文件名时,可以简写为“-lproject1”而不用写全。

    执行.test时出现上面错误提示,提示找不到动态链接库,执行“ldd ./test”,查看一下test用到的动态链接库都有哪些。

    可以看到“libproject1.so.1 => not found”,而程序用到的其他的库,如libc.so.6在“/lib”目录下,libstdc++.so.6在“/usr/lib”下可以找到。这两个路径(/lib和/usr/lib)正是Linux动态库的默认搜索路径。自己做的动态链接库(libproject1.so.1)需要复制到默认搜索路径里面,当应用程序执行是需要用到动态链接库里面的接口(maina),系统会自动地到默认搜索路径去找相应的动态库,然后把找到的动态链接库载入内存供应用程序使用。

    通过加载环境变量(LD_LIBRARY_PATH)来指定动态库搜索路径。

    之前的软件界面出来了。

    二、如何生成静态链接库并使用

    1、生成静态链接库

    在第三章创建的project1工程里面打开project1.pro,在里面添加一条语句“CONFIG += staticlib”。

    执行“qmake”生产新的Makefile,再执行“make”编译生成静态链接库libproject1.a。

    2、使用静态链接库

    在建立的testlib目录下创建teststaticlib目录,把生成的静态链接库(libproject1.a)和前面创建的mylib.h头文件以及测试代码test.cpp复制到teststaticlib目录下,执行“qmake -project”生成工程文件teststaticlib.pro,编译该文件,添加“LIBS += -L ./ -lproject1”,指定libproject1.a搜索路径,之后重新生成Makefile,编译运行工程,可以看到那个界面有蹦出来了。

  • 相关阅读:
    Django Swagger接口文档生成
    基于docker快速搭建hbase集群
    Cassandra数据操作管理工具tableplus
    基于docker创建Cassandra集群
    基于docker快速搭建hive环境
    [20200623]应用报错:当前事务无法提交,而且无法支持写入日志文件的操作
    zabbix--监控 TCP 连接状态
    kubernetes 使用ceph实现动态持久卷存储
    MySQL备份脚本
    Linux Pam后门总结拓展
  • 原文地址:https://www.cnblogs.com/heguoyuan/p/4278778.html
Copyright © 2020-2023  润新知