范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

如何在windows下使用开源库?

  一、前言
  大家好,我是ZhengN。
  最近工作中需要把项目嵌入式Linux平台代码移到Windows上做仿真模拟,需要解决三个问题: 搭建工程。 动态库替换为Windows的。 替换掉一些平台相关的代码。
  搭建工程上一篇已经分享了:实用 | 使用Cmake快速生成visual studio工程
  这篇我们来看看怎么在Windows上编译动态库。我们的项目中用到了几个开源库,下面通过实例来演示怎么编译得到相应的动态库。 二、静态、动态链接?
  在实例演示之前,有必要先简单了解一下静态、动态链接,因为有些初学的小伙伴可能不太了解。
  编译链接过程如:
  1、什么是静态链接?
  静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。
  链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。
  这里的库指的是静态链接库,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下载链接:
  https://github.com/gaobaoru/nanomsg/
  1、编译nanomsg的动态库
  一般开源库都会用 CMakeLists.txt 来管理工程,找到库的CMakeLists.txt 文件所在路径,如:
  这个路径下面会用到。需要注意的是,这个CMakeLists.txt不一定在根目录下,有些库会专门建一个文件夹来存放CMakeLists.txt。
  在nanomsg根目录新建一个文件夹存储我们编译得到的库,如 nanomsg_x64_lib :
  使用cmake-gui生成nanomsg的vs2019工程:
  如果 Configure 这一步顺利的话,会出现Configuring done:
  可能会出现一些警告或错误,不重要的警告我们就先不用管,如果有错误的话根据错误提示进行解决。
  生成动态库还是静态库,可以进行选择:
  然后点击Generate就生成VS工程:
  这时候可以看到我们的 nanomsg_x64_lib 文件夹下有生成VS工程文件了:
  可以双击打开 nanomsg.sln ,也可以点击cmake-gui的Open Project 打开工程:
  nanomsg解决方案中有58个项目,因为包含有一些例子之类的。我们只用到nanomsg项目,把这个项目设置为启动项目:
  按快捷键 Ctrl+B 生成nanomsg:
  没问题的话就可以看到编译生成nanomsg.lib与nanomsg.dll了。
  2、动态库使用验证
  上一步编译生成了nanomsg动态库,这一节我们来一起使用验证一下。
  验证代码我们拿实用 | 一个高性能通信库的简单使用分享 这篇文章的代码来修改。
  nanomsg可用于多线程、多进程、多机通信。nanomsg是一个socket library,所以其应用接口与标准的socket接口差不多,只是多了前缀 nn_ ,如nn_socket、nn_close、nn_send、nn_recv等。关于socket可查阅往期笔记:
  TCP、UDP通信总结
  下面演示进程间通信的client-server的例子,以下测试代码主要实现的是client-server进行收发测试。
  nanomsg_server.c: #include  #include  #include  #include "pair.h" #include "bus.h" #include "nn.h"  #pragma comment (lib,"nanomsg.lib")  // 链接导入库nanomsg.lib  #define BUF_LEN  100  char *url = "tcp://127.0.0.1:2021";   int main(void) {     int server_sock = 0;     char buf[BUF_LEN] = {0};          if (server_sock = nn_socket (AF_SP, NN_PAIR) < 0)     {         printf("create server socket failed! ");         return -1;     }          if (nn_bind(server_sock, url) < 0)      {         printf("bind server sock failed!r ");         nn_close(server_sock);         return -1;     }     printf("server init success! ");     while (1)     {         if (nn_recv(server_sock, buf, sizeof(buf), 0) < 0)          {             printf("recv failed! ");             nn_close(server_sock);             exit(EXIT_FAILURE);         }         else         {             printf("recieve client msg: %sr ", buf);             if (nn_send(server_sock, buf, sizeof(buf), 0) < 0)             {                 printf("send failed!r ");                 nn_close(server_sock);                 exit(EXIT_FAILURE);             }         }     }     nn_close(server_sock);          return 0; }
  在VS中,引入导入库有两种方式,一种方式是在工程属性设置中设置;另一种方式是使用 #pragma comment 的方式引入。这里我们用的是第二种。我们的nanomsg_server工程下有:
  编译没问题,运行会出错:
  找不到nanomsg动态库。我们把nanomsg.dll放入到与.exe文件同目录即可:
  再次运行没问题:
  nanomsg_client.c: #include  #include  #include  #include "pair.h" #include "bus.h" #include "nn.h"  #pragma comment (lib,"nanomsg.lib") // 链接导入库nanomsg.lib  #define BUF_LEN  100   char *url = "tcp://127.0.0.1:2021";   int main(void) {     int client_sock = 0;     char buf[BUF_LEN] = {0};          if (client_sock = nn_socket (AF_SP, NN_PAIR) < 0)     {         printf("create server socket failed! ");         return -1;     }          if (nn_connect(client_sock, url) < 0)      {         printf("connect server sock failed!r ");         nn_close(client_sock);         return -1;     }     printf("client init success! ");     while (1)     {         scanf_s("%s", buf, BUF_LEN);         if (nn_send(client_sock, buf, sizeof(buf), 0) < 0)         {             printf("send failed!r ");             nn_close(client_sock);         }         memset(buf, 0, BUF_LEN);             if (nn_recv(client_sock, buf, sizeof(buf), 0) > 0)          {             printf("recieve server msg: %sr ", buf);         }         memset(buf, 0, BUF_LEN);        }     nn_close(client_sock);          return 0; }
  nanomsg_client代码及注意事项与nanomsg_server类似,这里不再说明。
  运行验证:
  以上就是本次的分享,如有错误,欢迎指出,谢谢!
  原创不易,码字不易,如果文章对你有帮助,麻烦帮忙点赞/在看/转发,谢谢! 四、资源下载
  本篇笔记用到的资源、包括代码例子工程可以分享给大家,可在私信回复关键词: 制作动态库 ,我看到的话会及时发给大家。
  猜你喜欢:
  嵌入式必备之Git的使用
  分享一些可以快速入门的嵌入式教程
  C语言、嵌入式中几个非常实用的宏技巧
  1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。私信回复1024,即可免费获取!

有线无线随心换,随时享高品质音乐,TFZT2Pro体验虽然现在真无线耳机的发展很快,但是论音质,再好的无线耳机也比不上有线耳机,所以追求高品质音乐的发烧友还是会选择有线耳机,不过有线耳机在一些场景会显得不那么方便,比如运动的时候,今天联想还没有澄清说明事情的真相时,我们还会选购联想电脑吗?电脑无国界,顾客有国籍。天,要下雨娘,要嫁人,随她去吧。不会不但不会,还会尽力劝说周围的亲戚朋友不要买联想任何产品。我不会买联想电脑,曾经买了三台联想笔记本,前两台不错,最后一台发从2199降至1479,8256GB大容量5000mAH电池,OPPO千元机值吗?值得购买,尽管运行内存只有8G,不过8G运行内存不是用来打游戏,仅仅上网的话也够用了,况且机身有256G存储,可以说是存储无忧,有5000mAH大电池,价格从2199元降到14792021年,华为mate10还值得买嘛1。高素质的LCD屏幕现在2K分辨率的LCD屏幕有多难得大家知道么169大屏看起来是矮胖,但看视频效果是真的舒服全局DC调光的LCD屏,对于喜欢晚上躺床上关灯玩手机的人非常非常非常TCL复式分区洗衣机好吗?之前见到TCL复式分区洗衣机,总觉得上面的mini桶没什么用吧,而当我结婚和有孩子以后,才觉得真应该早点买TCL复式分区洗衣机。自从有孩子以后,孩子所有的衣物和其他需要清洗的小毛巾新能源车带动半导体需求大增IGBT迎来广阔成长空间财联社资讯获悉,汽车电动化网联化智能化发展趋势中带动汽车半导体需求大幅度增长。根据Gartner预测的数据,2024年单辆汽车中的半导体价值有望超过1000美元。汽车半导体包含功率集装箱航运公司粉碎了Facebook亚马逊腾讯等互联网的利润神话航运业长期以来因对千禧一代和Z一代缺乏吸引力而饱受指责,但它的数据令人印象深刻,给今天的大学毕业生带来了一些街头信誉。班轮运输现在的收入超过了许多大科技公司最知名的公司。美国Blu老黄今年赚翻了!英伟达财报再创新高,AMD还怎么追?11月18日,英伟达正式公布了2022财年三季度财报,总营收达到71。03亿美元,与去年同期的47。26亿美元相比增长了50,与上一季度的65。07亿美元相比增加9。净利润达到了2因补贴下调,特斯拉Model3Y均涨价4752元记者周纯粼编辑11月24日,特斯拉官网显示,特斯拉Model3后轮驱动版和ModelY后轮驱动板均涨价4752元。其中Model3价格从25。09万元上涨至25。5652万元,Mo鲁传颖印度正成为区域网络稳定的破坏者来源环球时报近期,一家中国网络安全企业发布报告称已捕捉到源自印度的国家级黑客组织向中国巴基斯坦等开展网络攻击,目标直指敏感军事部门。通过长期对该黑客组织的跟踪,报告指出,该组织已经谁能从元宇宙革命中脱颖而出?大摩点名Facebook和这四只股票财联社(上海,编辑黄君芝)讯,自从Facebook在10月份宣布更名为Meta,似乎在一夜之间将元宇宙概念推向了公众的视野。从那时起,大大小小的公司都在试图利用这一轰动的消息,他们
强强对话全新汉兰达对比福特锐界,7座SUV你更看好谁?文车魔王原创几年之前,如果家里是七口之家,那么选择车辆的范围会非常小。如果想要乘坐得舒服一点,那么选择大部分都是围绕MPV车型。不过放到现在来看,还有另外一种选择,就是大7座SUV国产合资硬碰硬!唐DM对比威兰达高性能版,看谁的混动技术更牛?文车魔王原创虽然纯电动车型有着更出色的行驶感受以及静谧性,但是由于电池的固有特性,所以在冬季的时候它的电池容量更容易衰减,标注500公里的续航可能实际仅有一半不到,那么这个时候如果对比影豹星瑞之后,人生第一台车决定选它,选对了吗?文车魔王原创很多年轻人毕业之后可能面临买车问题,我也不例外。尤其是最近上市的传祺影豹,以及吉利星瑞等高质量自主轿车确实都有着不错的吸引力。但是对于我来说,影豹虽然说性能强大,但在试三胎政策实锤,一奶同胞的2款SUV,必入奶爸法眼2021年6月,叽叽喳喳的二胎政策还在探究如何落实到位,沸沸扬扬的放开三孩已然实锤。政策一出,与之配套的7座SUV也被奶爸正大光明的提上日程。好了,开始报数3个孩子2个大人2位老人新款雅阁正式上市都升级了哪些地方?哪款更值得买?在曾经的日系三杰中,可以说雅阁是顺应年轻化潮头改款最成功的那一个,这点从它的销量便能窥知一二。不过虽说它在硬件技术方面的实力数一数二,但是在软件体验以及智能化方面却有不小的进步空间详解五菱征途5。88万起售的皮卡,究竟会有怎样的体验?文车魔王原创要想富,先修路整辆皮卡,咱就上路。之前的五菱宏光等一系列面包车算是给国人争足了面子。便宜耐用,拉货载人爬山过坎都不在话下。那作为同是致富路上的五菱小皮卡究竟会有怎样的体国庆节选车推荐3大国产MPV顶梁柱,都是性价比之作文车魔王原创考虑到国内实际的用车情况,其实对于MPV的需求来说并不比轿车以及SUV车型来的更多,但是随着国庆节假日的到来,MPV车型的优势就能体现出来。尤其是一家人出游的时候,MP懂大众的都买斯柯达?20万级别的B级车,这2款难道不香?文车魔王原创随着生活的进步,对于绝大多数的家庭来说B级车也再不是遥不可及的梦想了。相对于A级和C级车,很明显B级车的性价比更高。今天就为大家推荐这2款极具性价比的2。0T动力的B级小姐姐10万买座驾,这2款颜值出众,保证是你的菜!文车魔王原创小姐姐买座驾有其天然的审美格调,颜值百搭必须要首当其冲,撞衫绝对是不可以的。而好开实用的性能要求也是真实的诉求,不能有任何的水分。那么,手握10万左右的预算,小姐姐的座小鹏P5购车手册乍一看产品线丰富,分清楚系列却很好选择造车新势力,一提到这五个字或许大家都会联想到蔚来小鹏理想等新能源车企,这也充分说明了旗下车型的产品力逐渐得到了消费者的认可。而小鹏P7这样的纯电轿跑车型更是受年轻消费者的喜欢,不过2030万区间,被公认的3款SUV,想买车的不用犹豫!随着人们生活质量的提高,当今社会,选择一辆适合自己的车也成为必不可少的一部分。但面对如此多的车辆,如何选择?使不少人陷入纠结。那么,今天我们就来盘点一下。2021年,20万30万的