一次跨平臺程序崩潰問題
背景
最近接手一個程序移植的項目。原項目是運行在vxworks下的C代碼,同時還提供了windows平臺的工程。現在需要將其改造成arm版linux下和windows下跨平臺的程序。原代碼中也包含windows和linux兩個平臺程序。改造過程只是對arm版進行適應性修改,對部分功能進行補充。
但是在調試過程中卻出現了windows下面正常,linux下面程序 崩潰的問題。
定位問題
經過不斷的刪除和比較代碼,終於定位到了問題。
有一個源文件裏要用到目錄文件遍歷,代碼中使用了opendir
,readdir
,並且開頭包含了#include <dirent.h>
但是由於windows下無法使用這幾個函數,也沒有這個頭文件,所以,原項目中自己實現了一個dirent,包含dirent.h和dirent.c
定位到了問題下一步就是解決問題。
首先想到的是可能這兩個文件沒有條件編譯,讓編譯器把這兩個文件編譯進去了,導致函數錯誤。於是把這兩個文件的內容都加上條件編譯,直接斷絕後路,可是編譯之後,仍然奔潰。
後來直接把這兩個文件刪掉,再編譯就好了。
可是,刪掉也不是辦法,比較windows版還是需要的。
那麼問題出在了哪裏呢?推測如下:
雖然兩個文件裏面都加了條件編譯,裏面的代碼並未生效,但是因爲linux版要#include <dirent.h>
, 所以編譯器要去找dirent.h文件,由於文件夾中包含這個文件,所以會使用這個文件,即使在編譯器看裏面是空的,找到之後也就不會再去找系統文件夾裏的dirent.h,所以會出錯。但是當把文件刪除後,編譯器只能找到正確的dirent.h文件。
解決
找到了問題,解決就簡單了,不能刪除,但是可以改名,只要把頭文件的名稱改了,就一切正常了。