【问题标题】:STL link error with CodeComposerStudioCodeComposerStudio 的 STL 链接错误
【发布时间】:2011-05-27 09:32:52
【问题描述】:

我正在编译一个使用 STL 和 CodeComposerStudio 的混合 C/C++ 程序。 我有很多编译器注释和链接错误

编译器备注

!defined(__MINGW32__)

!defined(__MINGW32__) "C:/CCStudio_v3.3/C2000_v5.2.5/include/yvals.h",
 line 470: remark #195-D: zero
           used for undefined preprocessing identifier    #if
 199901L <= __STDC_VERSION__
                   ^ "C:/CCStudio_v3.3/C2000_v5.2.5/include/exception", line 181: remark #195-D: 
           zero used for undefined preprocessing identifier    #if
 __GNUC__ < 3 && !defined(__APPLE__) && !defined(__MINGW32__)!defined(__MINGW32__)

链接错误
已更新:已通过将rts2800_ml.lib 更新到最新版本(与编译器相同)来修复。

error: unresolved symbols remain  undefined                          
 ---------
 std::_Raise_handler                
 std::_Throw(const std::exception &)
 std::_String_base::_Xlen() const   
 std::_String_base::_Xran() const   

 error: unresolved symbols remainerror: unresolved symbols remain

问题
为什么 ???看来我在那里缺少一个包含或一堆定义。

配置
CodeComposerStudio V3.3
DSP TMS320C2812
C2000 v5.2.5

【问题讨论】:

  • 如果找到关于链接器错误的答案。与项目链接的文件rts2800_ml.lib 是旧版本。通过更新到最新,不再出现链接错误。我现在只有约 120 条评论。
  • 如果库已过时,标题是否也可能已过时?库和标题通常是齐头并进的。
  • @Clifford:标题没问题,库是从编译器文件夹中提取的,并包含在项目文件夹中。历史原因;)
  • 撇开历史原因不谈,这样做有很多充分的理由。然而,错误消息中的路径表明并非所有标头都是本地项目。您是否有可能使用与您的项目副本不兼容的库/编译器版本中的嵌套头文件?
  • 我搜索了所有项目包含的内容,但没有定义这些内容。

标签: c++ stl embedded code-composer


【解决方案1】:

#if 199901L &lt;= STDC_VERSION#if GNUC &lt; 3 的注释是针对这样一个事实,即在测试未定义宏的值时,宏被替换为零。因此,在这种情况下,即使编译器不是 GNUC,GNUC &lt; 3 也会成立。它应该用#if defined GNUC &amp;&amp; GNUC &lt; 3 限定或包含在defined GNUC 或其他GNUC 特定宏的早期测试中。

如果假定 STDC_VERSION 为零,则测试 #if 199901L &lt;= STDC_VERSION 将始终为假。此测试的标准宏实际上是 STDC_VERSION。但是,如果使用 C++ 编译,则应用的 C 标准无关紧要,因此对defined __cplusplus 进行事先测试可能是合适的。

这些宏通常由预处理器预定义,不需要标头。有关定义标准、编译器、架构和操作系统的预定义宏的详细信息,请参阅http://predef.sourceforge.net/prestd.html

链接器错误是一个不同的问题,无法通过#include 更多文件来解决。如果您缺少标头,则编译将失败。由于缺少代码,总是无法解析链接器符号。您可能没有链接必要的库或目标文件,或者代码可能已在早期的条件编译中被省略(错误的#if...#endif 块中的代码)。

【讨论】:

  • ok,define test 备注的意思我明白了,但是不知道为什么编译器没有定义这些宏。
  • 它们不是为既不是 GCC 也不是 MinGW 的编译器定义的。指定您正在使用 CCS 并没有说明正在使用什么编译器。这可能取决于您使用的是什么 TI 设备,以及它是否是 OMAP 设备,代码是用于 ARM 还是用于 DSP 内核。这些路径表明您使用的是 C20xx 设备;对吗?
  • 在 GCC 中,选项 -E -Wp,-dM 将导致输出定义的宏。如果您对一个虚拟的空源文件执行此操作,您将获得所有预定义的宏。请记住包括您正在使用的所有其他编译器选项,因为这可能会影响定义的宏。还要确保虚拟文件是 .cpp 以获取与 C++ 编译相关的文件。
猜你喜欢
  • 2017-08-22
  • 2015-03-19
  • 2016-04-28
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2012-12-24
相关资源
最近更新 更多