Программирование ARM: решение проблем, FAQ IAR: ошибка 'undefined external' на встраиваемую функцию Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


IAR: ошибка 'undefined external' на встраиваемую функцию Печать
Добавил(а) microsin   

Иногда линкер может выдавать ошибки для исходного кода C, где определена встраиваемая (inline) функция. Ошибка выдается следующая:

Error[e46]: Undefined external ... (от XLINK)
Error[Li005]: no definition for ... (от ILINK)

Эту ошибку линкер выдает, потому что компилятор не может удовлетворить некоторым базовым условиям генерации кода (для inline-функций). Другими словами, проверьте следующие моменты, и соответственно внесите нужные исправления:

● Компилятор во время процесса компиляции должен быть в состоянии "увидеть" определение inline-функции.
● Если inline-функция используется в исключительно одном файле .c, то переместите определение в этот файл .c.
● Для использования inline-функции в нескольких файлах .c обеспечьте выполнение следующих пунктов:

1. Поместите определение функции в заголовочный файл .h.

// Должен быть заголовочный файл (например foo.h), который обычно
// может подключаться во многих C-файлах.
inline unsigned char foo(unsigned char c) 
{ 
   return (c+1); 
}

2. Подключите этот заголовочный файл во все файлы .c, где используется вызов этой inline-функции.

3. Убедитесь, что существует только один .c файл с предварительной декларацией этой inline-функции.

// Эта строка должна быть только в одном C-файле
// (например foo.c):
extern inline unsigned char foo(unsigned char c);

Пункты 1 и 2 очевидны, но причину необходимости пункта 3 понять сложнее. Из ISO-стандарта для языка C: '...An inline definition does not provide an external definition for the function...' (перевод: '...Определение inline не предоставляет внешнее определение функции...'). Таким образом, декларация extern (из пункта 3) используется (линкером) для разрешения любых (не встроенных) ссылок на эту функцию.

Существуют ограничения для исходного кода C, который содержит встраиваемые (inline) функции. Например, убедитесь, что inline-функция не ссылается ни на какие статические символы (ни на переменные, ни на функции).

Для дополнительной информации по встраиваемым функциям см. руководство по разработке [2] или справочное руководство компилятора [3].

[Ссылки]

1. Handling Undefined external message for inline function site:iar.com.
2. IAR C/C++ Development Guide site:iar.com.
3. IAR C/C++ Compiler User Guide site:iar.com.

 

Добавить комментарий


Защитный код
Обновить

Top of Page