静态库和动态库(Windows版)
4 Windows创建和使用静态库
笔者这里使用的是VS2015,当然也可以使用其他工具。4.1生成静态库
1.首先打开VS,先新建一个项目,选择win32控制台应用程序,当然选择win32项目也可以。
2.接下来选择"下一步"进入应用程序设置,这里选择静态库并去掉预编译头,当然也可以在创建项目后去掉也是可以的。最后点击"完成"即可创建项目。
3.创建头文件(.h)以及源文件(.cpp)
StaticLib.h#ifndef _STATIC_LIB_H_ #define _STATIC_LIB_H_ #include namespace StaticLib { void print_hello(); //Test function } #endif
StaticLib.cpp#include "StaticLib.h" void StaticLib::print_hello() { std::cout << "Hello world!" << std::endl; }
4.生成解决方案,我这里选择的是release。
5.编译成功后就可以在工程目录下看到静态库。
4.2使用静态库
1.还是创建个普通的win32控制台程序。
在应用程序设置界面选择"控制台应用程序",还是不勾选"预编译头"。
2.我们把上面创建lib时的头文件包含到新创建的控制台程序中,同时将lib文件复制到工程目录下。当然也可在编写测试程序时使用库所在的路径。
3.然后在测试源文件中输入以下代码:#include "StaticLib.h" #pragma comment(lib,"WindowStaticLib.lib") int main() { StaticLib::print_hello(); system("pause"); return 0; }
#pragma comment(lib,"xxx.lib")表示链接xxx.lib这个库。
4.最后生成并执行工程。
值得注意的是,生成应用程序的环境应与创建库的环境一样。
当然还有一种调用方式。
首先在测试工程目录下新建如下文件夹,将库和头文件分别拷贝到相应的文件夹中。
然后在配置下工程属性:
另外还需要属性页面中选择链接器->输入->附加依赖项中添加新生成的库。
同样也能得到正确结果。
另外,调用的代码更改如下:#include "StaticLib.h" int main() { StaticLib::print_hello(); system("pause"); return 0; }
当然啦,也可以不配置链接器中的库。还是保留一下语句:#pragma comment(lib,"WindowStaticLib.lib")
以上两种方式本质都是一样的,只是通过不同的方式来配置罢了。5 Windows创建和使用动态库5.1生成动态库
1.首先创建一个动态库工程。
和静态库一样,取消去掉预编译头,这里选择DLL。
2.创建头文件(.h)以及源文件(.cpp)
DynamicLib.h#ifndef _DYNAMIC_LIB_H_ #define _DYNAMIC_LIB_H_ #include #define DLL_EXPORTS #ifdef DLL_EXPORTS #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif extern "C" { namespace DynamicLib { DLL_API void print_hello(); } } #endif // _DYNAMIC_LIB_H_
DynamicLib.cpp#include "DynamicLib.h" DLL_API void DynamicLib::print_hello() { std::cout << "Hello world!" << std::endl; }
【注1】__declspec(dllexport)是导出符号,也就是定义需要导出函数的dll中给导出函数的函数声明前面加上导出符号,表示该方法可以导出给其他DLL或者exe使用。
【注2】C++的代码加extern "C",是为了保证编译时生成的函数名不变,这样动态调用dll时才能。
3.选择release生成解决方案,最后生成的库如下图所示:
好了,动态库就创建好了。5.2使用动态库
1.还是创建个普通的win32控制台程序。
2.将前面创建的动态库的头文件(.h),dll文件复制到与测试项目中。
3.编写测试
有两种方法调用动态库,一种隐式链接,一种显示链接。
先说第一种隐式调用。隐式调用需要.h文件,.dll文件,.lib文件。
在源文件加入如下代码:#include "DynamicLib.h" #pragma comment(lib,"WindowDynamicLib.lib") int main() { DynamicLib::print_hello(); system("pause"); return 0; }
然后编译运行。
接下来在看看显式调用。显式调用需要.dll文件,.lib文件。#include #include typedef int(*dllfun)(void);//定义指向dll中函数的函数指针 int main() { HINSTANCE hlib = LoadLibrary(L"WindowDynamicLib.dll"); if (!hlib) { std::cout << "load dll error "; return -1; } dllfun fun = (dllfun)GetProcAddress(hlib, "print_hello"); if (!fun) { std::cout << "load fun error "; return -1; } fun(); //print_hello() FreeLibrary(hlib); system("pause"); return 0; }
结果和隐式调用一致。
显式链接需要.dll, 需要事先知道导出函数的签名,不需要.lib和.h文件
使用显式加载的好处:通过显式加载动态库的方式可以根据需要加载相应的函数,随时可以卸载,通过判断句柄的方式,不会因为找不到dll导致程序无法启动。如果程序需要访问十多个dll,采用动态加载的方式可以减少程序的启动时间,减小程序占用的内存。6静态库和动态库总结
静态库:编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
静态库的代码在编译时链接到应用程序中,因此编译时库文件必须存在并且需要通过"-L"参数传递给编译器,应用程序在开始执行时,库函数代码将随程序一 起调入进程内存段直到进程结束,其执行过程不需要原静态库存在。
动态库:动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。相当于静态库,不同的应用程序可以使用同一份动态库,因此可以节省内存。另外,而且动态库还可被其他语言调用,诸如Python。
总之,静态库和动态库的载入时刻不同,静态库是编译时用到的,动态库是运行时用到的。以Windows为例,如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
Linux版本如下:
静态库和动态库(Linux版)
挨打还说幸福,傻掉了吧?作者周炎林(原创)如需转载,务必请联系作者,未经允许,转载必究。温馨提醒欲看此篇,请坐好扶好,系好安全带,此趟时空旅行可能会引起乘客激动心情的情况出现,旅途中请保持耐心。挨打了还觉
国际功夫联合会主席团秘书长会议在泰国举行全球武林,论剑普吉聚力创新,共谋发展。为进一步在世界范围内弘扬中国武术功夫文化,推动中国武术功夫在全球的广泛传播,国际功夫联合会全球创新发展功夫经济高峰论坛国际功夫联合会会员国主席
如家亚朵桔子水晶排队涨价,打工人住不起快捷酒店打工人已经住不起快捷酒店了。到北京出差的雯子最近发现,北京的快捷酒店几乎都涨价了,涨价幅度堪称逆天。以前常住的酒店亚朵橘子价格都在400500之间浮动,而今年低于700的房间几乎是
淄博红叶柿岩郁金香赏花节来啦!淄博日报淄博晚报博览新闻记者耿雪浪漫春日,花开柿岩。红叶柿岩多重好礼上线,以花之名向所有女士发出诚挚邀请,3月1日至3月15日所有女性游客免门票入园,共赏9999株在古村盛放的郁金
64岁的倪萍才是搭配高手,穿衣简约不扮嫩,上了年纪仍优雅有气质不知不觉小时候的倪萍姐姐已经64岁了,在这个年纪的她无论是生活中还是上节目都特别的有气质,除了自身的素养以外,看到的就是穿衣风格了。看了很多种她的搭配,基本都是简约的设计,这种简约
数字经济时代的消费增值党的二十大报告提出,着力扩大内需,增强消费对经济发展的基础性作用和投资对优化供给结构的关键作用。数字经济时代消费比投资更重要。中国有句老话叫小利谋于市,大利谋于朝。所以,我们平凡人
高飞星黛露奥乐米拉求抱抱,上海迪士尼朋友互动体验回归据上海迪士尼度假区3月6日公布的信息,游客期待已久的与迪士尼朋友的近距离互动体验项目逐步重启。2023年3月7日中午,在上海迪士尼度假区米奇大街上,高飞星黛露奥乐米拉杰拉多尼等众多
1亿发子弹30万发炮弹!西方透露俄收到强援,美军无力出手拦截文肥佬茄子据天空新闻网3月9日报道,一名英国情报界人士向记者透露称,虽然伊朗当局矢口否认自己向俄罗斯提供了援助,但英方已经获得了足够的情报,能够证明伊朗向俄罗斯提供了大量的武器装备
6G时代,太赫兹技术将成为通讯领域的新宠在6G领域,太赫兹技术是一项非常重要的技术,它可以实现超高速高容量低延迟安全的通讯传输。太赫兹技术是一种高频电磁波技术,其频率处于微波和红外线之间。相比传统5G技术,太赫兹技术具有
氢能源车不行,真不能怪政策笔者注意到,新能源榜单上有台车异军突起,犹如黑马。这就是长安深蓝SL03。在某车之家的榜单上,长安深蓝SL03位于1520万榜单的第六位,位于2025万榜单地第七名,位于2535万
财政部确定继续上涨养老金,3000元和6000元涨钱相差2倍吗?财政部确定上涨养老金,3000元和6000元涨钱相差2倍吗?阳春三月天气转好,1。3亿退休人员翘首以盼的养老金第19次上涨,也终于最后敲定了。在财政部3月5日提请十四届全国人大一次
澎湃好物这件打底可穿春秋冬三季!高级有气质最近这两年,我越来越深刻的感觉到越是简单经典的衣服,越是高级耐看。而这就不得不提到这个经典中的经典纯色打底衫。搭得了衣服,撑得起场面。款式高级,耐看不过时。明星和时尚博主们几乎人手
34岁第一次做整容项目,术后4点真实感受不吐不快!我天生乐观开朗,认识我的人都喜欢我的性格。但随着年龄的增长,女孩子的烦心事也越来越多,从小时候的不挑吃穿到长大后的注重形象,渐渐的高颜值在脑海里留下深深的烙印。我发现自从25岁一过
莫言真正可怕的坏人,是那些不知道自己坏的人莫言真正可怕的坏人,是那些不知道自己坏的人。反而认为自己正确,认为自己是很好的人。他们没有良心,却挥舞着良心的大棒打人。他们没有道德,却始终占据着道德高地。那些知道自己坏的坏人的心
如果你身边突然出现了这3种人,恭喜你,老天爷要帮你了图源自网络侵权请联系删除上天要渡一个人,必然会让他的生活发生某些变化。如果你发现你身边出现了以下三种人,那么恭喜你,这很有可能意味着,你的生活出现了转机,你即将迎来好运。一不管你风
亲人逝去,不掉眼泪的人,大多是以下几种人图源自网络侵权请联系删除生离死别是人生大痛,尤其是自己的亲人离开的时候,对我们来说无异于剜心刻骨。很多人在痛苦时会嚎啕大哭,用泪水来宣泄他们的情绪。但是也有一些人,在亲人逝去的时候
女人彻底放下一个人时的样子三不作者闻秋声原创文章,抄袭必究01引言爱就像做一道题,总想找到正确的解题思路,得到正确的答案。而不爱了,就像是做错了一道题,把所有答案都抹去。时间会改变一切,包括刻骨铭心的感情。相爱
与妻书万千荣耀,不及日日晨昏间的琐细摘自平均分作者康辉亲爱的我想,若你读到这封信,恐怕会有些许的讶异。是的,好久没写过这样的信,也好久没有这样叫过你了。生疏?会有一点吧。我们已经越来越习惯那更多带着寻常日子里烟火气的
如果万物不多情入夜,我站在广西北海的酒店8楼往窗外看,海天交织成墨色。凌空伸进海上的步道,逶迤向前生出一条光带。我被光吸引,不顾夜色正浓,也不顾初来的疲倦,迎着海风来到海上。眼下正是北海的好时光
27年的漫长告别,结局让人泪腺失控离家时,你会跟父母好好告别吗?是一句简单的我走了哈,还是仔细看着父母的表情,给他们一个拥抱,听听他们的唠叨再离开?春节时,网上传播着不少感人视频,儿女离开家乡,父母准备了满满一后备
随笔走着走着,就走到了人生的夕阳,剩下的路,慢点走,别逞能米米作走着走着,就走进了人生的夕阳。虽说,夕阳景致璀璨夺目,令人惊艳,但多少有些感伤。把老的安详地送走了,把孩子养大能够自食其力了。使命已完成,回头一看,只剩夕阳余晖了。自己不能说
雪之语因为爱雪之语作者雅致丝语编辑秋枫摄影岱岳疏影轻轻地,我来了我是雪,载着殷殷的期盼纷纷洒洒,飘逸而来只为和冬天相遇圣洁的冬天你是我广阔的天地我在你的世界里,纯洁的盛开你在我的温柔里,深情地