场景复现
今天下午,客户反映我们系统的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环境变量中,搞定!程序开始执行!!