Ошибка связи STL с CodeComposerStudio

#c #stl #embedded #code-composer

#c #stl #встроенный #составитель кода

Вопрос:

Я компилирую смешанную программу на C / C , используя STL с CodeComposerStudio. У меня много замечаний компилятора и ошибок ссылки

замечания компилятора

 !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 amp;amp; !defined(__APPLE__) amp;amp; !defined(__MINGW32__)!defined(__MINGW32__)
  

ошибки связи
ОБНОВЛЕНЫ: исправлено путем обновления rts2800_ml.lib до последней версии (такой же, как у компилятора).

 error: unresolved symbols remain  undefined                          
 ---------
 std::_Raise_handler                
 std::_Throw(const std::exception amp;)
 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

Комментарии:

1. Если найден ответ об ошибках компоновщика . Файл, rts2800_ml.lib связанный с проектом, был старой версией. При обновлении до последней версии ошибки ссылки больше не будет. Теперь у меня есть только ~ 120 замечаний.

2. Если библиотека устарела, возможно, ее заголовки также устарели? Библиотеки и заголовки обычно идут рука об руку.

3. @Clifford: Заголовки в порядке, библиотека была извлечена из папки компилятора и включена в папку проекта. Исторические причины 😉

4. Помимо исторических причин, есть множество веских причин для этого. Пути в сообщении об ошибке, однако, предполагают, что не все заголовки являются локальными для проекта. Возможно ли, что вы используете вложенные заголовки из версии библиотеки / компилятора, несовместимой с копиями вашего проекта?

5. Я искал во всех включениях проекта, нигде эти вещи не определены.

Ответ №1:

Замечания для #if 199901L <= STDC_VERSION и #if GNUC < 3 касаются того факта, что при проверке значения неопределенного макроса макрос заменяется нулем. Таким образом, в этом случае GNUC < 3 будет верно, даже если компилятор не является GNUC. Она должна быть указана в #if defined GNUC amp;amp; GNUC < 3 или заключена в более ранний тест для defined GNUC или другой макрос, специфичный для GNUC.

Если предполагается, что STDC_VERSION равен нулю, то тест #if 199901L <= STDC_VERSION всегда будет false. Стандартный макрос для этого теста на самом деле является STDC_VERSION. Однако применяемый стандарт C не имеет значения, если используется компиляция C , поэтому может потребоваться предварительный тест для defined __cplusplus .

Эти макросы обычно предопределены предварительным процессором и не требуют заголовка. Подробные сведения о предопределенных макросах, определяющих стандарты, компиляторы, архитектуры и ОС, см.http://predef.sourceforge.net/prestd.html

Ошибки компоновщика представляют собой другую проблему и не могут быть решены путем #включения дополнительных файлов. Если бы у вас отсутствовал заголовок, компиляция завершилась бы неудачно. Неразрешенные символы компоновщика неизменно из-за отсутствия кода. Возможно, вы не связали необходимую библиотеку или объектный файл, или код, возможно, был опущен при более ранней условной компиляции (код внутри блока false #if...#endif ).

Комментарии:

1. хорошо, я понимаю значение замечаний define test, но я не знаю, почему эти макросы не определены компилятором.

2. Они не определены для компиляторов, которые не являются ни GCC, ни MinGW. Указание того, что вы используете CCS, ничего не говорит о том, какой компилятор используется. Это может зависеть от того, какое устройство TI вы используете, и, если это устройство OMAP, предназначен ли код для ARM или ядра DSP. Пути предполагают, что вы используете устройство C20xx; это правильно?

3. В GCC параметры -E -Wp,-dM вызовут вывод определенных макросов. Если вы сделаете это для фиктивного пустого исходного файла, вы получите все предопределенные макросы. Не забудьте включить все другие параметры компилятора, которые вы используете, поскольку это может повлиять на определенные макросы. Также убедитесь, что фиктивный файл является .cpp, чтобы получить те, которые имеют отношение к компиляции C .