静态库

动态链接库与静态链接库的区别

隐身守侯 提交于 2020-04-07 15:02:10
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。静态链接库与静态链接库调用规则总体比较如下。 对于静态链接库(比较简单): 首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。 生成库的.h头文件中的声明格式如下: extern "C" 函数返回类型 函数名(参数表); 在调用程序的.cpp源代码文件中如下: #include "..\lib.h" #pragma comment(lib,"..\\debug\\libTest.lib") //指定与静态库一起链接 第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:) 对于动态链接库: 动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。

c++动态链接库及静态链接库的生成与使用

核能气质少年 提交于 2020-03-18 19:48:21
1,新建控制台工程xdltest,改属性-配置属性-常规-配置类型为 动态库.dll或静态库.lib 2,打开工程后添加 dltest.h, dltest.cpp,其中.h与.cpp名字没必要一样 3,编写代码 ---------------------------------------------- --dltest.h #pragma once _declspec(dllexport) void Print(const char* str); ---------------------------------------------- --dltest.cpp #include<iostream> #include"dltest.h" void Print(const char* str) { std::cout << "dltest>> " << str << std::endl; } 4,编译,生成 <库的名字是根据工程名生成的> 若是静态库,则会生成 xdltest.lib. 若是动态链接库则生成 xdltest.lib 和 xdltest.dll 5,使用 (1)将xdltest.lib添加到 <属性-配置属性-链接器-输入-附加依赖项> (2)在<属性-配置属性-链接器-常规-附加库目录>中指定xdltest.lib的目录 (3)在<属性-配置属性-c/c++-常规

IOS 制作静态库的两种方法

一曲冷凌霜 提交于 2020-02-28 11:50:07
第一种方法:直接新建一个工程,具体操作请参照博客 http://blog.csdn.net/pjk1129/article/details/7255163 原作者写得非常详细,在此谢过。 第二种方法:在原有工程上操作,打开已存在的工程,然后添加一个要做成.a静态库的 Target 在此,简单命名为mylibrary 此处可以看到,新建的Target 里面同时具有 mylibrary.h mylibrary.m 这个咩有用,可以直接删除。 然后就是怎么弄自己的静态库了,你有一些.h .m 文件需要打成静态库,先把你需要打成静态库的东西复制一份,放好,然后把你工程里的那一份.h .m 删除,然后把你刚才复制的那一份拖进工程,选择Targets 里面的工程名和静态库名称。即两个对号都打上。然后添加上。下图是创建新的.h .m的操作,等同于直接add操作。 然后选择 静态库 同时 Edit Sheme 然后 Run 就可以看到 原来的红色的显示,变成了正常的 此时表明一个静态库已经打出来了,当然还有些注意事项,已经在第一个pjk1129 的博客里写清楚了,我不重复。 同时有些注意事项,已有写明 详见博客 http://webfrogs.me/2012/12/18/ios-static-lib/ 来源: oschina 链接: https://my.oschina.net/u/2361492

八一八在共享DLL中使用MFC和在静态库中使用MFC

时光总嘲笑我的痴心妄想 提交于 2019-12-06 07:04:48
最经在用MFC做一个新浪的小东西,遇到的问题已让我无力吐槽,学到用时方恨少! 今天总结一下在有win32控制台转到MFC时遇到的一个问题。首先说一说共享DLL和静态库: 使用VS2008,在项目属性中有一项MFC的使用,有三种设置:    1.使用标准Windows库   2.在共享DLL中使用MFC    3.在静态库中使用MFC    第一种顾名思义。第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。第三种是将DLL中的相关代码写进EXE文件中,文件较大,但是可以在没有相关DLL的机器上运行。 由于当初配置环境耗费了很大的精力,本想使用静态库来使程序在不同机子上跑起来,可是让人头痛的缓冲区溢出来了。总是提示“其原因可能是堆被损坏或者它所加载的任何DLL中存在BUG”由于在MFC中我用到了CString向string的转化,所以就认为是不是这里的问题,搞到头痛也没解决问题…… 后来突然想到既然是堆被损坏,或者DLL有BUG,那么是不是由于DLL加载到EXE中造成了堆的损坏呢?就将属性调到了共享DLL,你妹啊,就这样跑起来了!!! 求前辈们解释…… 来源: oschina 链接: https://my.oschina.net/u/566587/blog/162429

Head First C 学习日志 第八章 静态库与动态库 静态库的创建与使用

倖福魔咒の 提交于 2019-12-05 00:19:22
Head First C 学习日志 第八章 静态库与动态库 静态库: 静态库是1个或者一组目标文件.o的归档,在链接阶段使用,生成一个可执行文件。 静态库引入的原因是,当你的程序由多个源文件构成,而你想共享.o文件,当然你可以将所有的.o都共享,但是这样实在不方便,于是我们就将1个活多个.o文件,归档为1个.a 静态库文件 。 创建一个静态库: 将原文件编译为.o文件 gcc yourcode.c -c 使用.o文件创建静态库: ar -rcs libhfsec.a encrypt.o checksum.o 命令ar表示归档 rcs:r表示如果.a文件存在就更新它,c表示存档时不显示反馈信息,s表示告诉ar在.a文件开头创建索引。 libhfsec.a:这是我们要创建的 静态库 文件,注意一定要以libxxx.a命名。 encrypt.o checksum.o:这是我们要归档的.o文件。 使用静态库文件 gcc testrun.c -L/Users/AlexTuan/HFC/lib/stlib -lhfsec -o testrun testrun.c:是我们的main函数所在的源文件 -L/Users/AlexTuan/HFC/lib/stlib:-L表示,指定静态库文件所在的目录,目录可以用绝对路径和相对路径,不指定则从系统默认的静态库路径查找。 -lhfsec

关于Unix静态库和动态库的分析

谁都会走 提交于 2019-12-02 18:56:33
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。 ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so 1、使用库 当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以 一旦连接成功,静态程序库也就不再需要了 。 然而,对动态库而言,就不是这样。 动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库 。由于动态库节省空间,linux下进行连接的 缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。 现在假设有一个叫hello的程序开发包,它提供一个静态库libhello.a 一个动态库libhello.so,一个头文件hello.h,头文件中提供sayhello()这个函数 /* hello.h */ void sayhello(); 另外还有一些说明文档。 这一个典型的程序开发包结构 与动态库连接 linux默认的就是与动态库连接

gcc编译生成静态及动态链接库步骤

北城以北 提交于 2019-12-02 18:25:57
这两天在看《Linux C程序设计大全》,吴岳编著,清华大学出版社。这本书是在一个培训机构看到的,在网上查了下该书的相关信息。从目录而言,该书涵盖了Linux下C程序设计的较多内容,包括C语言基础(主要讲解C语法结构)、C语言开发环境(主要介绍VIM使用、GCC使用、makefile编写、gdb使用)、Linux进程操作、Linux文件操作、Linux网络编程这几部分。阅读了该书几个小章节,总体而言,书的部分内容较充实,但是存在较多编辑错误,部分样例实际运行时与书中内容不符。 这里使用该书P192-P199的例子,总结下gcc编译静态及动态链接库的方法及步骤。 程序清单如下: test.c文件内容: int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { return a / b; } test.h文件内容: #ifndef _TEST_H_ #define _TEST_H_ extern int add(int a, int b); extern int sub(int a, int b); extern int mul(int a, int b);

静态链接库、动态链接库

我的梦境 提交于 2019-12-02 10:50:07
1.代码的重用 一般在程序中,代码重用可以用函数来实现; 给其它程序重用代码的实现有两种方式: 1】静态链接库 2】动态链接库 也就是可以用来实现模块化; 1.静态链接库 1)创建静态链接库 vc6中创建:File ->new ->Projects ->Win32 Static Library 头文件: #if !defined(AFX_HELLO_H__0A93BBBF_3714_47C0_A953_6BC530AAD15A__INCLUDED_) #define AFX_HELLO_H__0A93BBBF_3714_47C0_A953_6BC530AAD15A__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 int Plus(int x, int y); int Sub(int x, int y); int Mul(int x, int y); int Div(int x, int y); #endif // !defined(AFX_HELLO_H__0A93BBBF_3714_47C0_A953_6BC530AAD15A__INCLUDED_) cpp文件: #include "Hello.h" int Plus(int x, int y) { return x+y; }   int

iOS静态库的那些坑

坚强是说给别人听的谎言 提交于 2019-12-02 04:15:44
iOS静态库的那些坑 最近项目需要我开发一个内嵌iOS的SDK,直白说就是要写一个通用的静态库。很久以前我也做过类似的事,不过由于不是商用的东西,没有深入研究,但这次不一样了。原以为很简单的东西,最后我还是踩了不少的坑,所以特此纪录一下。 一、基本背景 网上有很多介绍静态库的资料,基本的步骤我就不重复叙述,这里的介绍很详细: http://www.cocoachina.com/applenews/devnews/2013/1204/7468.html 我只重复几个关键点: 静态库所依赖的dylib或者framework,最终使用静态库的程序也需要引用。 静态库是二进制代码,区分处理器类型的,可以使用lipo -create –output创建支持多处理器的静态库。 编译时请把Build Configuration选择为Release Objective-C无真正私有方法,所以你静态库想要暴露多少接口,多少类,完全取决于你的头文件。 二、命名问题 iOS程序员大多都会使用第三方的开源代码,对于直接在应用中使用这些代码,一般是不会对其做出什么修改的。但是静态库不一样,在静态库中使用开源代码必须要注意几件事。 类的命名: 由于Objective-C没有命名空间,所以定义名字相同的类会视为重复定义。因此使用开源代码的时候,必须要对其类名进行修改。我建议是加上三位字母以上的前缀

iOS深入学习(创建静态库static library)

有些话、适合烂在心里 提交于 2019-12-01 05:07:03
在项目开发的过程中,经常使用静态库文件。例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节。 简介: 库是一些没有main函数的程序代码集合。除了静态库,还有动态链接库,他们之间的区别是:静态库可以编译到我们的执行代码中,应用程序可以在没有静态库的环境中运行;动态库不能编译到我们的执行代码中,应用程序必须在有链接库文件的环境下运行。 创建静态库的步骤如下所示, 1、创建Static Library,新建->Project,选择Static Library, 如图, 点击Next,我将Static Library项目名称命名为TimeDate,因为这是我用于处理时间和日期的静态库工程, 2、静态库文件功能的实现细节 创建了静态库Static Library项目之后,Xcode自动为我们创建了TimeDate.h/.m文件,如下图所示, 这时候我们需要在这里面填充一些细节,这里,我想要实现的功能就是将时间戳NSTimeInterval转换成NSString的功能,那么代码的细节如下所示, TimeDate.h文件 @interface TimeDate : NSObject - (NSString *)changeToStandardTime:(NSTimeInterval)timeInterval;