一次跨平台程序崩溃问题

一次跨平台程序崩溃问题

背景

最近接手一个程序移植的项目。原项目是运行在vxworks下的C代码,同时还提供了windows平台的工程。现在需要将其改造成arm版linux下和windows下跨平台的程序。原代码中也包含windows和linux两个平台程序。改造过程只是对arm版进行适应性修改,对部分功能进行补充。

但是在调试过程中却出现了windows下面正常,linux下面程序 崩溃的问题。

定位问题

经过不断的删除和比较代码,终于定位到了问题。

有一个源文件里要用到目录文件遍历,代码中使用了opendirreaddir,并且开头包含了#include <dirent.h>

但是由于windows下无法使用这几个函数,也没有这个头文件,所以,原项目中自己实现了一个dirent,包含dirent.h和dirent.c

定位到了问题下一步就是解决问题。

首先想到的是可能这两个文件没有条件编译,让编译器把这两个文件编译进去了,导致函数错误。于是把这两个文件的内容都加上条件编译,直接断绝后路,可是编译之后,仍然奔溃。

后来直接把这两个文件删掉,再编译就好了。

可是,删掉也不是办法,比较windows版还是需要的。

那么问题出在了哪里呢?推测如下:

虽然两个文件里面都加了条件编译,里面的代码并未生效,但是因为linux版要#include <dirent.h>, 所以编译器要去找dirent.h文件,由于文件夹中包含这个文件,所以会使用这个文件,即使在编译器看里面是空的,找到之后也就不会再去找系统文件夹里的dirent.h,所以会出错。但是当把文件删除后,编译器只能找到正确的dirent.h文件。

解决

找到了问题,解决就简单了,不能删除,但是可以改名,只要把头文件的名称改了,就一切正常了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章