2013-10-25 105 views
2

因爲我喜歡折磨自己,在將GCC 4.7移植到Android之後,我決定立即嘗試將GCC 4.8移植到Android。Cross-Native GCC 4.8 Build:libcpp錯誤:long long無效轉換爲off_t(又名long int)

我構建的libcpp部分期間遇到了以下錯誤:

../../gcc-4.8/libcpp/files.c:725:27: error: cannot convert 'long long int*' to 'off_t* {aka long int*}' for argument '7' to 'unsigned char* _cpp_convert_input(cpp_reader*, const char*, unsigned char*, size_t, size_t, const unsigned char**, off_t*)' 

我的問題是:如果這種轉換可能嗎?

編輯:我最初發布了一個演員需要被寫入而不是依賴於隱式轉換的答案,但是根據我在做這件事後遇到的問題,我刪除了它。

這裏是原來的有問題的代碼:

file->buffer = _cpp_convert_input (pfile, 
           CPP_OPTION (pfile, input_charset), 
           buf, size + 16, total, 
           &file->buffer_start, 
           &file->st.st_size); 

這裏是我試過投(注:我只有℃的基本理解):

off_t ot = (off_t) file->st.st_size 

使用上述結果投中一「在目標設備上運行時,來自cc1二進制文件的錯誤地址「錯誤。

+0

C中的對象指針類型之間沒有隱式轉換(除了'void *')。 – ouah

+0

編輯:等待...根據口袋C(我發佈後發佈),隱式轉換是可能的標量和指針類型之間。對象指針和指針類型有區別嗎? – MonaLisaOverdrive

回答

1

在我問這個問題24小時後,答案出現了。

注意:下面是從24小時的C語言解析...如果有任何不正確的,請隨時發表評論。

「縮小」轉換與「隱式」轉換相同,顯然這在Android本機開發中是不允許的,或者仿生libc是不可能的......我不確定哪一個是。因此,爲了使files.c中的函數正常工作,傳遞給_cpp_convert_input的long long int需要轉換爲off_t。

我將轉換添加到files.c作爲解決方法;如果構建工作,我會用它更新這個答案。

編輯:不幸的是我添加的演員沒有工作......構建完成,但生成的二進制文件在設備上運行時拋出了「不良地址」。我會將修改發佈到另一個問題。

編輯:演員陣容......我只是沒有寫得對。感謝和榮譽喬納森Wakely誰糾正了這個:

off_t ot = (off_t) file->st.st_size 
funct(*args*, &ot) 

到這一點:

off_t ot = (off_t) file->st.st_size; 
funct(*args*, &ot); 
file->st.st_size = ot; 

那加另一個顯式轉換添加到macro.c加編輯以gengtype.c裏,GCC/Makefile.in和double-int.h允許構建完成並且二進制文件在設備上運行。