Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: link не видит inline функций
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
mronetwo
Появилось некоторое время чтобы скрестить eclipse c IARом, переношу готовый проект под эту среду. Все бы ничего , но линкер при сборке не находит в объектных файлах inline функций (они целиком, как положено находятся во включаемых h-файлах).
Чего то я понять не могу чего ему от меня надо. В документации вижу фигу. Кто сталкивался? Подскажите какие волшебные слова ему сказать надо? Хелп ми.
Непомнящий Евгений
Приведи минимальный пример. Ни разу не сталкивался...
shmur
Цитата(mronetwo @ Mar 30 2012, 16:28) *
Появилось некоторое время чтобы скрестить eclipse c IARом, переношу готовый проект под эту среду. Все бы ничего , но линкер при сборке не находит в объектных файлах inline функций (они целиком, как положено находятся во включаемых h-файлах).
Чего то я понять не могу чего ему от меня надо. В документации вижу фигу. Кто сталкивался? Подскажите какие волшебные слова ему сказать надо? Хелп ми.


Если GCC, то там вроде inline объявляется как static inline, тут.
mronetwo
Цитата(Непомнящий Евгений @ Mar 30 2012, 16:34) *
Приведи минимальный пример. Ни разу не сталкивался...


Минимальный пример чего? inline функции?

Цитата(shmur @ Mar 30 2012, 16:37) *
Если GCC, то там вроде inline объявляется как static inline, тут.



эээ. Не GCC , нет. IAR/

Если я как static функцию опишу в h-файл ее не включишь.
Непомнящий Евгений
Цитата(mronetwo @ Mar 30 2012, 16:43) *
Минимальный пример чего? inline функции?


Минимальный пример программы, которая выдает ошибку линковки. Вместе с самой ошибкой
mronetwo
Я прям не знаю...

в файле bipper.c из функции bip_out вызываем функцию bip_pwmout(sound_freq) вот так:
Код
#include "bipper_pwm.h"
....
char bip_out (int state)
{
....
   bip_pwmout(sound_freq);
...
}



В файле bipper_pwm.h описываем вызываемую функцию:
Код
#include "pwm.h"

inline void bip_pwmout
(
  u32 sound_frequency
)
{
  pwm_output(AT91C_PWMC_CHID3, (MCK / sound_frequency / 2), (MCK / sound_frequency));
}


функция pwm_output описана в файле pwm.h, тело находится в pwm.c, подключенном к проекту

В результате получается ошибка

Код
[Li005] no definition for bip_pwmout referenced from bipper.o


Такой минимальный пример сойдет?
Непомнящий Евгений
Вроде бы ничего криминального.

Попробуй посмотреть на результат препроцесора biper.c, там точно есть inline void bip_pwmout() вместо с телом?
mronetwo
Цитата(Непомнящий Евгений @ Mar 30 2012, 17:09) *
Вроде бы ничего криминального.

Попробуй посмотреть на результат препроцесора biper.c, там точно есть inline void bip_pwmout() вместо с телом?


А что если его нет? Такое как может быть?

Сугубо под IARом компилиться без проблем.
Непомнящий Евгений
Цитата(mronetwo @ Mar 30 2012, 17:13) *
А что если его нет? Такое как может быть?


Чтобы он появился, надо поставить какую-то галку в настройках проекта.

Цитата
Сугубо под IARом компилиться без проблем.

В смысле без проблем? Ты ж говоришь - ошибка линковки...
mronetwo
Цитата(Непомнящий Евгений @ Mar 30 2012, 17:19) *
Чтобы он появился, надо поставить какую-то галку в настройках проекта.

Уже завтра поищу. Куда вообще эта сволочь девает объектники? В папке проекта не нашел.


Цитата(Непомнящий Евгений @ Mar 30 2012, 17:19) *
В смысле без проблем? Ты ж говоришь - ошибка линковки...

Если пользоваться IARовской средой - все нормально.

Это тот же проект, но под eclipse+iar. Видимо eclipse еще что то хочет, вот только что?
Сергей Борщ
QUOTE (mronetwo @ Mar 30 2012, 16:31) *
Если пользоваться IARовской средой - все нормально.

Это тот же проект, но под eclipse+iar. Видимо eclipse еще что то хочет, вот только что?
А оптимизация случаем не отключена в случае с eclipse? Помнится, при выключенной оптимизации gcc отключает встраивание. Не знаю как IAR, но может быть что-то подобное?
Непомнящий Евгений
Чего то я упустил момент про эклипс.

Сравни командные строки компилятора и линкера эклипса и ИАРа - скорее всего чего-то напутано с флагами компиляции
mronetwo
Вобщем бедовый какой-то этот эклипс, оказывается проект не билдился нормально вообще. Система сборки эклипс выдавала ошибку, причем непонятно какую, а я по непытности сразу этого не понял. Тыканем во всякое понял что подцепил в разных папках два файла с одинаковыми именами. Самое смешное что даже если удалить в одном месте эти файлы, собрать проект все рано невозможно. Даже если удалить проблемную папку из проекта, а потом подцепить снова. Clean ни из среды ни вручную не помогает. пришлось переименовать папку из которой удалил файлы и все собралось. Однако.
mronetwo
Да вот еще. На вкладке свойств compiler/language не стоит забывать про Use C++ inline semantics.
andrew_b
Цитата(mronetwo @ Mar 30 2012, 15:43) *
Если я как static функцию опишу в h-файл ее не включишь.

С чего это вдруг? Эта функция будет видна в каждой единице трансляции, где включается файл, причём независимо от других таких же единиц. А вот без static линкер должен ругаться на множественное определение функции.

Цитата
На вкладке свойств compiler/language не стоит забывать про Use C++ inline semantics.
Если проект на языке Си, ничего плюсового быть не должно.
mronetwo
Цитата(andrew_b @ Apr 4 2012, 11:37) *
С чего это вдруг?


Поторопился с выводами.

Цитата(andrew_b @ Apr 4 2012, 11:37) *
Если проект на языке Си, ничего плюсового быть не должно.


Надо работать. Рассуждать о чистоте языка не надо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.