-
动态库、静态库编译测试:含静态库链接动态库、静态库,动态库链接静态库、动态库
2018-09-07 15:18:06本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。 太长不看版:请跳至文章最后的总结对比表。...④动态库libbb.so依赖动态库libaa.so的测试; ...本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。
太长不看版:请跳至文章最后的总结对比表。
一。内容包含:
①静态库libbb.a依赖静态库libaa.a的测试;
②静态库libbb.a依赖动态库libaa.so的测试;
③动态库libbb.so依赖静态库libaa.a的测试;
④动态库libbb.so依赖动态库libaa.so的测试;
所用到的文件列表:
aalib.cpp aalib.h bblib.cpp bblib.h main.cpp
二。源代码:
aalib.h
#ifndef AALIB_H
#define AALIB_H
#include "stdio.h"
void helloAA();#endif
********分割线**************
aalib.cpp
#include "aalib.h"
void helloAA()
{
printf(" lib AAAAAAAAAAAAA\n ");
}********分割线**************
bblib.h
#ifndef BBLIB_H
#define BBLIB_Hvoid helloBB();
void helloAB();#endif
********分割线**************
bblib.cpp
#include "bblib.h"
#include "aalib.h"void helloBB()
{
printf(" lib BBBBBBBBBBBBBBBB \n");
}void helloAB()
{
printf(" *a*******************\n");
helloAA();
helloBB();
printf(" *b*******************\n");
}********分割线**************
main.cpp
#include "bblib.h"
int main()
{
helloBB();helloAB();
}
三。测试过程
①静态库libbb.a依赖静态库libaa.a的测试
现在生成了静态库libaa.a和libbb.a,下面测试静态库的使用方法:
可以看到链接静态库的话要指定静态库依赖的静态库,否则编译不过去!由此可见轻易不要链接静态库,因为你也许不知道你要用的静态库还依赖着哪些库.......
那么将所依赖的静态库编译进静态库呢?试试
可以看到,使用命令ar rcs libbb.a bblib.o libaa.a并没有起到作用,亦即libaa.a并没有被编译进libbb.a,因此编译可执行程序时还需要链接libaa.a。
改用下面这种方式编译,可行:
即编译静态库libbb.a时不要链接libaa.a而是用aalib.o文件,亦即编译静态库链接静态库时不能直接链接静态库,而是用形成该静态库的那些.o文件,可以使用 ar -x libaa.a来获取静态库的所有.o文件(注意:所有.o文件的顺序要对,被依赖的要放后面)。
②静态库libbb.a依赖动态库libaa.so的测试
第一行命令:gcc -o libaa.so -shared -fPIC aalib.cpp
等价于:gcc -c -shared -fPIC aalib.cpp 加 gcc -o libaa.so -shared -fPIC aalib.o 这两条(注意编译.o时要加选项-shared -fPIC,否则无法生存.so)
可以看到,编译可执行程序时只链接静态库不链接动态库编译不过去!运行时也需要动态库libaa.so支持
那么将动态库编译进静态库中呢?试试
可以看到,虽然编译静态库libbb.a的时候链接了动态库libaa.so,编译可执行程序只链接静态库libbb.a也能编译过去,但是在执行时还是要libaa.so动态库支持。
③动态库libbb.so依赖静态库libaa.a的测试
可以看到编译libbb.so时链接静态库出错,提示静态库需要使用-fPIC选项来编译,那就按照提示的来修改编译命令:
静态库所需的.o文件使用-shared -fPIC编译,然后在编译动态库的时候链接静态库好用了。并且编译可执行文件时不用链接被依赖的静态库。
来看一下这个动态库libbb.so依赖哪些库:
可以看到没有依赖libaa.a这个静态库。
④动态库libbb.so依赖动态库libaa.so的测试
动态库链接动态库成功,并且编译可执行文件时也不用链接被依赖的库,但是运行时还是要两个动态库支持。
四。总结
被依赖的库aa 编译库aa的命令 直接库bb 编译库bb的命令 编译可执行程序的命令 编译时是否需要库aa 运行时是否需要库aa libaa.a gcc -c aalib.cpp
ar rcs libaa.a aalib.o
libbb.a gcc -c bblib.cpp ar rcs libbb.a bblib.o gcc -o out main.cpp libbb.a libaa.a 需要 不需要 libaa.a gcc -c aalib.cpp ar rcs libaa.a aalib.o libbb.a gcc -c bblib.cpp ar rcs libbb.a bblib.o aalib.o gcc -o out main.cpp libbb.a 不需要 不需要 libaa.so gcc -o libaa.so -shared -fPIC aalib.cpp libbb.a gcc -c bblib.cpp ar rcs libbb.a bblib.o libaa.so gcc -o out main.cpp libbb.a 不需要 需要 libaa.a gcc -c aalib.cpp ar rcs libaa.a aalib.o libbb.so gcc -o libbb.so -shared -fPIC bblib.cpp libaa.a 编译libbb.so就出错,无法编译成动态库 libaa.a gcc -c -shared -fPIC aalib.cpp ar rcs libaa.a aalib.o libbb.so gcc -o libbb.so -shared -fPIC bblib.cpp libaa.a gcc -o out main.cpp -L./ -lbb 不需要 不需要 libaa.so gcc -o libaa.so -shared -fPIC aalib.cpp libbb.so gcc -o libbb.so -shared -fPIC bblib.cpp -L./ -laa gcc -o out main.cpp -L./ -lbb 不需要 需要 其他说明:链接静态库时要注意顺序,使用第二行的方法编译直接库libbb.a的时候用到被依赖库的.o文件,注意些个.o文件的依赖顺序也很重要,不能错,被依赖的要放后面。另外:编译好的动态库要指定路径,否则运行时找不到动态库的位置。
五。结论
由于本测试的初衷是找出一种方法使得编译可执行程序时不链接那些被依赖的库,因此第二行和第五行的组合可以作为备选方案。
-
jna对于动态地址的动态库的加载
2020-05-15 11:23:13动态库的接口,里面只写动态库的调用方法 public interface CaautooutMap extends Library { String calculate(String intput_data); //main的调用,在main方法中就可以指定动态库的加载地址 public static void ...动态库的接口,里面只写动态库的调用方法
public interface CaautooutMap extends Library { String calculate(String intput_data); //main的调用,在main方法中就可以指定动态库的加载地址 public static void main(String[] args) { CaautooutMap instance = (CaautooutMap) Native.loadLibrary(Path.CAAUTOOUT_PATH, CaautooutMap.class); String result = instance.calculate("参数内容"); } }
-
QT下生成动态库并链接动态库
2019-05-21 13:33:17QT下生成动态库并链接 请测有效 Qt下生成动态库,参考文章: https://www.cnblogs.com/boright88/p/6263137.html Qt下链接动态库,参考文章: https://blog.csdn.net/yanmanm/article/details/82704651 1、 qt下生成...QT下生成动态库并链接
请测有效
Qt下生成动态库,参考文章: https://www.cnblogs.com/boright88/p/6263137.html
Qt下链接动态库,参考文章: https://blog.csdn.net/yanmanm/article/details/82704651
1、 qt下生成动态库
(1)、新建库。文件à新建文件及项目à库(Library)
à选择共享库并输入库名称à一直点击下一步直到填写类信息à为类命名à点击完成。(2)、点击项目à取消影子文件的勾。
(3)、查看库文件所在目录下是否生成两个.h和一个.cpp文件。
(4)、在*.h文件中加入自己的功能函数。
(5)、点击构建。
(6)、查看库文件所在目录下的debug或release里是否有.dll文件。有则成功生成动态库。
2、 qt动态库的链接
新建widgets项目.
(1)、qt显示调用动态库(较麻烦,lib文件不存在)
(2)、qt隐示调用动态库(需要.lib文件的存在)
1、如1.2的方法去掉新建项目的影子目录. 2、将库文件的.dll .lib .h三个文件拷贝到新建widgets. 3、对项目点击”添加库”->外部库->并浏览到.lib文件目录点击完成. 4、初始化库对象实例.并调用方法.
-
使用gcc生成动态库及使用动态库的方法
2018-10-30 15:23:32进行动态库编译,链接动态库 -Ldir 在动态库的搜索路径中增加dir目录 -lname 链接静态库(libname.a)或动态库(libname.so)的库文件 -fPIC(或fpic) 生成使用相对地址无关的目标代码 方法一...gcc常用编译选项:
选项
含义 -static 链接静态库,禁止使用动态库 -shared 进行动态库编译,链接动态库 -Ldir 在动态库的搜索路径中增加dir目录 -lname 链接静态库(libname.a)或动态库(libname.so)的库文件 -fPIC(或fpic) 生成使用相对地址无关的目标代码 方法一:
第一步:使用-shared参数生成动态库,gcc -shared -fPIC -o libtest.so test.c 然后把libtest.so复制到/usr/lib64/系统路径下
注意:生成的动态库的名字必须是lib+名字.so,之后可以直接使用-ltest来引用动态库。
第二步:编译main.c,使用libtest.so动态库,gcc -o main main.c -L/usr/lib64/ -ltest
方法二:
在编译main.c,并链接libtest.so的时候,直接指定使用当前目录下的libtest.so文件,
使用命令:gcc -o main main.c ./libtest.so
-
vs生成动态库及使用动态库
2017-05-25 21:51:30动态库(.dll):动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可... -
docker for windows调取dll动态库
2019-12-26 15:52:48本次docker的环境是安装在win10系统,在docker容器内部访问dll动态库文件 一、本次项目的服务节点是多模块协作的,需要在每个容器中运行一个服务节点,所以需要部署多个docker,最后用k8s统一管理 1、win10环境下... -
通俗理解动态库与静态库区别
2019-06-21 15:27:46引:最近做了算法产品化相关的一些工作,其中涉及到算法库封装的相关工作,封装为动态库。总结动态库和静态库区别和对应使用原则。 区别:静态库和动态库最本质的区别就是:该库是否被编译进目标(程序)内部。 ... -
VS2010 中编写动态库和调用动态库
2018-11-12 23:05:42... VS2010 中编写动态库和调用动态库 百度查了一下在VS中编写动态库的方法,亲测有效。 (1)启动VS2010》文件》新建》项目,按下图进行选择填写,选择Win32控制台应... -
理解静态库与动态库(浅谈静态动态库的区别)
2018-09-01 11:14:24理解静态库与动态库 静态库 概念 静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库 ... -
makefile与动态链接库案例分析——动态库链接动态库
2016-01-14 15:37:00背景:效率考虑,要重用把服务器主备机方案,以库Libmdpha(高...复制动态库到主工程相关路径,并改makefile,主要加复制命令和建立软连接的命令,库名注意统一: 引用库中加入Libmdpha 同时加 cp -f $(INTERFACES_ -
QtEmbedded-4.8.6-arm 编译选择从 动态库变化到静态库 时,生成的Makefile链接库路径下如果有动态库和静态...
2018-10-10 14:56:38问题:QtEmbedded-4.8.6-arm 编译选择从 动态库到静态库 时,发现的一个疑惑:,生成的Makefile链接库路径下如果有动态库和静态库,优先选择动态库编译应用 具体现象: 我最初是使用动态库的 QtEmbedded-4.8.6-... -
动态库是什么?怎么检查动态库是否正确?
2014-12-09 09:22:39什么是软件动态库?软件安装号之后如何检查动态库是否正确?手机软件安装之后会有动态库吗? -
iOS 动态库和静态库的的区别 动态库的隔离与静态库的吸附问题以及解决方法
2017-05-03 10:40:21起因 理论功底 动态库和静态库 介绍 静态库和动态库的区别 举个例子, iOS 项目中使用 Embeded Framework ...静态库和动态库如何构建和加载 ...静态库和动态库依赖关系 ...制作动态库 -
Linux-C动态库与静态库的编译与调用
2018-07-25 16:44:24Linux-C动态库与静态库的编译与调用 一、简述 记录-Linux-C动态库与静态库的编译与调用。将实现某部分功能的代码封装成库文件,以方便调用,或者是对代码进行保护加密。应用场景:有时想将某代码提供给别人用,... -
关于QT动态库,利用动态库导入界面(实例)
2018-07-21 17:56:54最近需要搞懂一个事情,就是QT如何用使用动态库。我们需要解决以下几个问题: 1.有时候我们不希望在当前工程下设计界面,而是希望把界面做成一个动态链接库,然后主程序调用这个动态链接库,然后主程序把这个动态库... -
C++静态库与动态库
2016-10-20 09:50:56这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养... -
C++静态库与动态库的区别?
2018-08-17 20:29:59C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本... -
C++静态库和动态库用法
2018-07-19 23:50:11从事软件工作也有两年了,C++静态库和动态库也用了不少,但都是依葫芦画瓢,一直没具体去研究一下二者的区别,加载方式等,今天花时间看了几篇博客,重新学习了一下,做出如下笔记。 2、定义 静态库和动态库从字面意思来... -
VS2015动态库静态加载时指定动态库位置的方法
2017-05-27 06:15:28在VS2015中静态加载动态库时,需要将库文件(DLL)拷贝到调用程序所在的路径下,如果所需动态库较多时,就会非常麻烦。可以在项目中指定应用程序搜索动态库的路径,这样就无需再将动态库文件进行拷贝了。 可以通过两... -
Qt动态加载动态库
2017-08-02 15:45:27Qt动态加载动态库 1、2017年8月2日15:44:16。 #include QLibrary lib("JutzeImageProc.dll"); if (lib.load()) { typedef int (*CalVolumeFunType)(const cv::Mat & , const cv::Mat & , double & , double... -
Linux静态库和动态库的制作
2020-03-11 14:57:191.什么是库文件?...(1)使用静态库生成的可执行文件大于动态库生成的可执行文件(程序占用的内存较多) (2)使用静态库生成的可执行文件难以升级,使用动态库生成的可执行文件易于升级 (3)使用静态库生... -
程序调用动态库,编译通过,调用动态库函数运行出现undefined symbol错误
2018-08-23 16:18:45编了一个动态库,写测试程序去调用动态库,程序编译通过,调用动态库里函数出错,通过加上动态库相关依赖库以及 extern“C”声明解决该错误 以下,详细说明解决经过: 首先,刚编译好的动态库需要配置好配置... -
C--静态库与动态库
2018-06-07 14:48:402、动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于... -
Linux下gcc生成和使用静态库和动态库详解
2016-05-31 17:54:25Linux下gcc生成和使用静态库和动态库详解(原文链接) 本文在原文的基础上做一些详细验证,部分稍有改动, 一、基本概念 1.1什么是库 1.2库的种类 1.3库存在的意义 1.4库文件是如何产生的在linux下 1.5库文件... -
VS2015动态库编程之Win32动态库的使用(下)
2017-07-06 22:16:454 动态库的加载及调用 动态库的加载分为静态加载、动态加载两种方式。 4.1 静态加载动态库 静态加载动态库的步骤包括:设置项目附加库目录;设置项目附加依赖项;移动DLL文件以及声明动态库的导出函数。 创建... -
android 使用动态库或静态库来编译生成动态库
2013-12-20 16:36:41使用静态库来编译动态库 例如项目A产生静态库testa.a, 项目B需要用testa.a生成动态库testb.so A项目的android.mk文件: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := testa LOCAL_SRC_FILES ... -
linux两种库:动态库和静态库(共享库)说明
2017-12-21 10:17:11linux下有两种库:动态库和静态库(共享库)二者的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中... -
python 动态库和静态库
2019-02-13 10:27:03学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了。一把翻译再执行... -
动态库、静态库、运行时库、引入库之间的区别
2019-01-07 09:19:23动态库、静态库、运行时库、引入库之间的区别 杂集。捡对口味的看看吧。 转自:http://lingualspark.blog.sohu.com/94785899.html 运行时库:Unix中一个典型的运行时库例子就是libc,它包含标准的C函数,如,... -
cmake 生成动态库、静态库详细讲解
2019-05-22 11:31:46HelloWorld CMake CMake中构建静态库与动态库及其使用