zoukankan      html  css  js  c++  java
  • 【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!
    ";     // 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 型指针
          
  • 相关阅读:
    Introduction to debugging neural networks
    Faster R-CNN教程
    最长递增子序列
    321. Create Maximum Number 解题方法详解
    Ubuntu安装opencv with cuda
    转载:LeetCode:5Longest Palindromic Substring 最长回文子串
    64. Minimum Path Sum
    322. Coin Change
    148. Sort List
    微信浏览器禁止页面下拉查看网址(不影响页面内部scroll)
  • 原文地址:https://www.cnblogs.com/nmj1986/p/10539057.html
Copyright © 2011-2022 走看看