CMake⼿把⼿教你在Windows下编译、使⽤开源库
1024G 嵌⼊式资源⼤放送!包括但不限于C/C++、单⽚机、Linux等。关注【嵌⼊式⼤杂烩】,回复1024,即可免费获取!
⼀、前⾔
⼤家好,我是ZhengN。
最近⼯作中需要把项⽬嵌⼊式Linux平台代码移到Windows上做仿真模拟,需要解决三个问题:
搭建⼯程。
动态库替换为Windows的。
替换掉⼀些平台相关的代码。
搭建⼯程上⼀篇已经分享了:
这篇我们来看看怎么在Windows上编译动态库。我们的项⽬中⽤到了⼏个开源库,下⾯通过实例来演⽰怎么编译得到相应的动态库。⼆、静态、动态链接?
在实例演⽰之前,有必要先简单了解⼀下静态、动态链接,因为有些初学的⼩伙伴可能不太了解。
编译链接过程如:
1、什么是静态链接?
静态链接是由链接器在链接时将库的内容加⼊到可执⾏程序中的做法。
链接器是⼀个独⽴程序,将⼀个或多个库或⽬标⽂件(先前由编译器或汇编器⽣成)链接到⼀块⽣成可执⾏程序。
为什么现在都用cmake这⾥的库指的是静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。
2、什么是动态链接?
动态链接(Dynamic Linking),把链接这个过程推迟到了运⾏时再进⾏,在可执⾏⽂件装载时或运⾏时,由操作系统的装载程序加载库。
这⾥的库指的是动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
需要注意的是,在Windows下的动态库也会提供两个⽂件:.lib⽂件与.dll⽂件。但这⾥的.lib⽂件叫做导⼊库,是由.dll⽂件⽣成的。
导⼊库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执⾏⽂件时,只需要链接导⼊库,DLL中的函数代码和数据并不复制到可执⾏⽂件中,在运⾏的时候,再去加载DLL,访问DLL中导出的函数。
3、静态链接与动态链接的优缺点?
(1)静态链接的优缺点:
优点:
代码装载速度快,执⾏速度略⽐动态链接库快;
只需保证在开发者的计算机中有正确的.lib⽂件,在以⼆进制形式发布程序时不需考虑在⽤户的计算机上.lib⽂件是否存在及版本问题。缺点:
使⽤静态链接⽣成的可执⾏⽂件体积较⼤,包含相同的公共代码,造成浪费。
(2)动态链接的优缺点:
优点:
⽣成的可执⾏⽂件较静态链接⽣成的可执⾏⽂件⼩;
适⽤于⼤规模的软件开发,使开发过程独⽴、耦合度⼩,便于不同开发者和开发组织之间进⾏开发和测试;
不同编程语⾔编写的程序只要按照函数调⽤约定就可以调⽤同⼀个DLL函数;
DLL⽂件与EXE⽂件独⽴,只要输出接⼝不变(即名称、参数、返回值类型和调⽤约定不变),更换DLL⽂件不会对EXE⽂件造成任何影响,因⽽极⼤地提⾼了可维护性和可扩展性;
缺点:
使⽤动态链接库的应⽤程序不是⾃完备的,它依赖的DLL模块也要存在,如果使⽤载⼊时动态链接,程序启动时发现DLL不存在,系统将终⽌程序并给出错误信息;
速度⽐静态链接慢;
4、动态链接动态链接优缺点类⽐
我们可以把静态链接与动态链接做⼀个这样⼦的⽐喻:把链接过程看做我们平时学习时做笔记的过程。
我们平时学习时准备⼀本笔记本专门记录我们的学习笔记,⽐如在某本书的某⼀页上看到⼀个很好很有⽤的知识,这时候我们有两种⽅法记录在我们的笔记本上。
⼀种是直接把那⼀页的内容全部抄写⼀遍到笔记本上(静态链接);另⼀种是我们在笔记本上做个简单的记录(动态链接),⽐如写上:xxx知识点在《xxx》的xxx页。
从这两种⽅法中我们可以很清楚地知道两种⽅式的特点。第⼀种⽅式的优点就是我们在复习的时候就很⽅便,不⽤翻阅其它书籍了,但是缺点也很明显,就是占⽤笔记本的空间很多,这种⽅法很快就把我们的笔记本给写满了。
第⼆种⽅式的优点就是很省空间,缺点就是每当我们复习的时候,⼿头上必须备着相关的参考书籍,⽐如我们去教室复习的时候,就得背着⼀⼤摞书去复习,这样我们复习的效率可能就没有那么⾼了。
这对应到我们的动态链接与静态链接上是不是就很好理解了。
三、编译、使⽤开源库
下⾯以实例来演⽰Windows在下编译开源库,以编译开源库nanomsg为例。
关于nanomsg的⽂章:
nanomsg下载链接:
1、编译nanomsg的动态库
⼀般开源库都会⽤来管理⼯程,到库的⽂件所在路径,如:
这个路径下⾯会⽤到。需要注意的是,这个不⼀定在根⽬录下,有些库会专门建⼀个⽂件夹来存放。在nanomsg根⽬录新建⼀个⽂件夹存储我们编译得到的库,如nanomsg_x64_lib:
使⽤cmake-gui⽣成nanomsg的vs2019⼯程:
如果Configure这⼀步顺利的话,会出现Configuring done:
可能会出现⼀些警告或错误,不重要的警告我们就先不⽤管,如果有错误的话根据错误提⽰进⾏解决。⽣成动态库还是静态库,可以进⾏选择:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论