【tips】編譯epic異常解決


目標:編譯 epic

異常信息一:

      No CMAKE_C_COMPILER could be found. 
      No CMAKE_CXX_COMPILER could be found.
 
解決方法:
    編譯異常提示中有鏈接 “Open File”,點擊該鏈接,則直接跳轉到出錯誤的地方。我是在運行 android.toolchain.cmake 時異常,現列出如下:
 
    1. 異常提示:找不到 ndk toolchain 文件
      首先,看項目設置的 ndk 路徑有無問題,如圖示:
      
      此處沒問題。
      其次,看 cpp 包中 shell 腳本配置的 ndk 路徑有無問題:
      
      此處有問題。黃色框中請改成你自己在環境變量配置的 android sdk 全局路徑名。epic項目中這里寫的 ANDROID_SDK,我自己是ANDROID_HOME。MacOS OS一般在用戶目錄下的 .bash_profile;Window OS打開“環境變量”配置窗口即可看見;Ubuntu OS一般在用戶目錄下的 .profile;請自行查找。
    
    2. 再次編譯,依然出錯,再次 Open File,直接跳轉到了如下圖所示:
      
      現在不支持 gcc 編譯了,咋辦?看下此處上下文代碼邏輯,然后……,
      
      注:(“制定”修改為“指定”)
    3. 再次編譯,還是出錯,但根據第二次的解決方式,這次就很好找。依然點擊鏈接“Open File”:
      
      看到沒?不支持armeabi啦!所以,我們留下支持的 arm 架構,如下圖所示:
      
 
    然后,編譯成功!
      
    
    參考鏈接:
  
 
異常信息二:
         epic/library/src/main/cpp/fake_dlfcn.cpp:117:25:  error: arithmetic on a pointer to void
         shoff = ((void *) elf) + elf->e_shoff;  // void *shoff = elf(Elf64_Ehdr *) + elf->e_shoff(__u64)
                      ~~~~~~~~ ^
異常原因:
         void * 不能進行運算(不同的C標准,有不同的定義。比如:按ANSI標准,不能對 void * 進行運算;而GNU則指定 void * 的算法操作與 char * 一致)
 
異常分析:
     1. 寫一個測試代碼:testvoidpointer.cpp
#include <iostream>

struct Elf_Ehdr{
    int a;
    int b;
    int c;
};

int main(int argc, const char * argv[]) {
    // insert code here...
    
    // occur error code 
    void *shoff;
    Elf_Ehdr *elf = new Elf_Ehdr();

    shoff = ((void *) elf) + 2001;
    shoff += 1;
        
    std::cout << "Hello, World!\n";     // 1. std is namespace.
    return 0;
}

    2. 用g++編譯,結果如下:

             

    3. 用clang編譯,結果如下:
             
 
解決方案:根據代碼上下文,將 void * 的 指針轉換為 char * 即可。
                  示例代碼:
                            shoff = ((void *) elf) + elf->e_shoff;          
                            shoff = ((char *) elf) + elf->e_shoff;    
        
                    參考資料:
                             Pointer  arithmetic for void pointer in C
                             void 及 void 指針含義的深刻解析
                             C++ void * 的使用
                             C++ 中 void 型指針
      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM