一次跨平臺程序崩潰問題

一次跨平臺程序崩潰問題

背景

最近接手一個程序移植的項目。原項目是運行在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文件。

解決

找到了問題,解決就簡單了,不能刪除,但是可以改名,只要把頭文件的名稱改了,就一切正常了。

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