记一次把Windows程序移植到Linux的过程

谁说胖子不能爱 提交于 2019-12-05 16:51:21

场景复现

今天下午,客户反映我们系统的API在Linux下使用时有点问题。发布主管,想在本地做个测试,但是目前现有的Demo程序只有windows版本的,所以找到负责API的我,把该Demo程序从Windows移植到Linux。


问题及解决方案

问题1:

windows下的vsnprintf_s在Linux下该替换为什么呢?

解决方法:

Linux下可以采用vsnprintf函数来对vsnprintf_s进行替换。

注意点:

vsnprintf与vsnprintf_s的参数对应基本相同,只不过需要给出所要写入的buffer的大小。具体请参见vsnprintf和vsnprintf_s的函数定义。


问题2:

windows下的Sleep函数在Linux下替换为什么?

解决方法:

Linux下对应的睡眠函数为sleep和usleep,不同点在于,sleep函数对应的睡眠时间参数是以秒为单位的,usleep函数对应的睡眠时间参数是以微秒为单位的。而windows下的Sleep函数的参数是以毫秒为单位的。



问题3:

编译时遇到如图所示问题:




解决方案:

本次编译出现上面问题的原因是所用的Linux操作系统是64位的,而所链接的动态库所支持的是32位操作系统,进而把动态库替换为64位的即可解决问题。



问题4:

编译链接得到可执行文件之后,执行可执行文件出现如图所示错误提示:




解决方法:

由问题描述可知,找不到动态库文件,但是动态库明明是存在的,不然编译时是怎么用的?
所以可以推测出,引发该问题的原因是,执行时,找不到该动态库,由此想到了LD_LIBRARY_PATH环境变量,Linux在执行可执行程序时,会从该环境变量获取查找动态链接库的目录,进而从相应目录中查找链接相应的动态链接库,所以查看下该环境变量



一看,果然没有我们的动态库所在的目录,果断添加之:



可以看到已经将我们的动态链接库所在目录添加到了LD_LIBRARY_PATH环境变量中,搞定!程序开始执行!!
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!