This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:在简单的TI ARM 16.9 .4.LTS编译器程序上运行静态代码分析器(CodeSonar)会在缺少的"STLport"头文件(如“s_c__linux.h”)上出现错误-这些文件在哪里?

Guru**** 2604225 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/630209/compiler-running-a-static-code-analyzer-codesonar-on-a-simple-ti-arm-16-9-4-lts-compiler-program-gives-errors-on-missing-stlport-header-files-e-g-s_c__linux-h---where-are-these-files

工具/软件:TI C/C++编译器

在 简单的TI ARM 16.9 .4.LTS编译器程序上,在Ubuntu 16.04 上运行静态代码分析器(如CodeSonar),如下所示:

#include <Cstring>

INT MAIN ()

   返回0;

}

由于TI编译器附带的嵌入式和修改的“STLport”库中似乎缺少头文件,因此...会出现分析和生成错误。 实际上,对于所示的程序,静态分析器会产生三种类型的错误:

(i)     缺失的包含文件错误(x4),如“s_c__linux.h”,“s_c_stl_mycomp.h”, “s_c__native_headers.h”, “u_Cstring”似乎是CodeSonar真正报告的缺失。 这可能是正确的,因为它们在文件系统的任何位置都不存在。 TI是否可以提供这些头文件,或者我在这里缺少什么解决方案?

  ‘无法确定CodeSonar真正报告的平台类型,CodeSonar的预处理程序错误(x1)为“无法确定endianess”,因为Endian符号_STLP_Big_ENDIAN或_STLP_Little_ENDIAN都未在文件“s_c_features.h”中定义,但初步研究表明这些都是由TI编译器头设置的 “./ti-CGT-arm_DIN.4.LTS/lib/src/s_c_ti.h”,应在/usr/include/DIAN等系统文件中定义,endian.h但似乎不是这样,并且可能建议平台不匹配或疏忽(Ubundi 16.04 和16.9 编译器似乎使用“__Little-ENAN”)。 这需要进一步调查。

(iii) 未定义的宏,其中CodeSonar似乎真正报告了‘#  include _STLP_native_CPP_C_HEADER (Cstring)‘的错误(x1)。 CodeSonar可以合法地要求include语句的参数为文件名,但预处理程序无法解析符号_STLP_native_CPP_C_HEADER的原因可能是与上面项目(i)相同的问题,即缺少STLport头文件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    (i)这些头文件位于$(CG_TOOLS_ROOT)/包含中,就像stdio.h一样
    (ii)当目标为little-endian__时,TI编译器预定义了宏__litte_endian__。 可能CodeSonar有一个配置文件来模拟编译器的预定义;该变量需要在该文件中进行适当设置
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的帮助。

    您的问题(ii)的答案是"是",但在(i)上,我找不到您提到的文件,但是,我只安装了名为"ti_CGT_TMS470_TMS4.LTS_Linux_installer_x86.bin" 16.9 的TI ARM 16.9 4.LTS发行版。 那么,您是说这四个头文件应该在该发行版中...还是我需要下载其他工具? 为了说明我的问题,下面是在干净的编译器安装目录上的几个“ls”命令,它们显示在我全新的编译器安装中没有这四个文件(例如“s_c_stl_mycomp.h”):

    LS ./ti-CGT-ARM_LTS.4.LTS/include/s_c_*.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c_compat.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c__epilogue.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c_features.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c_host.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c_locale.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c__prologue.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c_stl_confix.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c__system.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c__ti.h 16.9
    ./ti-CGT-arm_LTS.4.LTS/include/s_c_user_config.h 16.9

    ls 16.9 ./ti-CGT-arm_LTS.4.LTS/include/u_cstring.h
    LS:无法访问'./ti-CGT-arm_LTS.4.LTS/include/u_Cstring.h' 16.9 :没有这样的文件或目录
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ray Felton 说:
    (i)     缺少包含文件错误(x4),如“s_c__linux.h”

    。以缺少 的s_c__linux.h包含文件为例,如果您查看 include/s_c__system.h文件, 则s_c__linux.h包含在一个#if块内:

    (__linux__)
    # include <s_c__linux.h>/*
    
    # ifdef __KCC
    # include <s_c__ka.h>#
    endif
    */
    #Elif defined (_WIN32)|| defined (__WIN32)|| defined (WIN32)|| defined (__WIN32)|| defined (__WIN32__)||\
    已定义(__WIN16)||已定义(WIN16)||已定义(_WIN16)
    
    #包含<s_c__windows.h>
    #else
    #包括<s_c__ti.h>#endif
    
    
    !defined (_STLP_Compiler)
    /*无法识别编译器,发出错误诊断。
    *编辑<config/stl_mycomp.h>为编译器设置STLport。 */
    #包括<s_c_stl_mycomp.h>
    #endif 

    我认为问题在于 您的CodeSonar设置认为 Linux或 __Linux__已定义,这会导致 尝试包含s_c__linux.h文件,而该文件不是TI编译器安装的一部分。

    因此 ,CodeSonar使用的预定义符号的定义需要与TI编译器使用的实际预定义符号相匹配。