目標:編譯 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++編譯,結果如下:

解決方案:根據代碼上下文,將 void * 的 指針轉換為 char * 即可。
示例代碼:
shoff = ((void *) elf) + elf->e_shoff;
✕
shoff = ((char *) elf) + elf->e_shoff;
✓
參考資料: