Gradient 1 6 июля, 2015 Опубликовано 6 июля, 2015 · Жалоба Собираю в IAR порт scmRTOS под СС2540. Линкер не хочет подключать асм функции. Что только не мудрил - не получается.. может у кого будут идеи как пофиксить. Linking Warning[w46]: External function "os_start" in module main (main.r51) has no global definition Warning[w46]: External function "os_context_switcher" in module OS_Kernel (OS_Kernel.r51 ) has no global definition Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 33 8 июля, 2015 Опубликовано 8 июля, 2015 · Жалоба Собираю в IAR порт scmRTOS под СС2540. Линкер не хочет подключать асм функции. Что только не мудрил - не получается.. может у кого будут идеи как пофиксить. Linking Warning[w46]: External function "os_start" in module main (main.r51) has no global definition Warning[w46]: External function "os_context_switcher" in module OS_Kernel (OS_Kernel.r51 ) has no global definition Возможные причины, вроде, три: 1) Линкер по какой-то причине не видит объектные файлы с этими функциями. 2) Функции в асме не декларированы как экспортируемые в глобальное пространство имён (у IAR это, как помню, с помощью public делается). 3) В cpp файлах имена импортируются без extern "C", что приводит к проблемам из-за манглинга имён. Надо посмотреть настройки проекта и упомянутые места в порте. Вообще, я полагал всегда, что если линкер не находит имя, на которое ссылается код, то это ошибка, а не предупреждение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 8 июля, 2015 Опубликовано 8 июля, 2015 · Жалоба Надо признать, у меня квалификации не хватило пофиксить. Хотя "грызли всей семьёй" несколько дней. Если есть желание посмотреть, могу скинуть в личку ссылку на проект, но он под последний IAR. Изложенные 3 причины известны и проверены. Всё вроде правильно оформлено, дока пристально читалась и примеры изучались... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 33 9 июля, 2015 Опубликовано 9 июля, 2015 · Жалоба Надо признать, у меня квалификации не хватило пофиксить. Хотя "грызли всей семьёй" несколько дней. Если есть желание посмотреть, могу скинуть в личку ссылку на проект, но он под последний IAR. Изложенные 3 причины известны и проверены. Всё вроде правильно оформлено, дока пристально читалась и примеры изучались... Давайте, попробую тоже, вдруг получится. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 9 июля, 2015 Опубликовано 9 июля, 2015 · Жалоба Отослал. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beketata 0 21 декабря, 2019 Опубликовано 21 декабря, 2019 (изменено) · Жалоба Ну и как результат? Есть проект со смешанным кодом на C++ и ASM. Ассемблерная функция: NAME tools RSEG CODE_C:CODE:NOROOT ; =============== S U B R O U T I N E ======================================= PUBLIC swap_bits swap_bits: mov A, R1 mov C, ACC.1 rlc A mov ACC.2, C mov C, ACC.3 rlc A mov ACC.4, C mov C, ACC.5 rlc A mov ACC.6, C swap A mov R1, A ret ; End of function swap_bits END Эта функция объявлена в C++ extern "C" { unsigned char swap_bits( unsigned char ); } и используется: unsigned char bt; ... bt = swap_bits( bt ); ... Линкер выдает предупреждение: Warning[w46]: External function "swap_bits" in module ... has no global definition В документации сказано: If no other errors have been encounter, this error is generated by an assembler-language call from C where the required declaration using the $DEFFN assembler-language support directive is missing. The declaration is necessary to inform XLINK of the memory requirements of the function. Но нигде в документации про директиву $DEFFN ничего более найти не удалось. Изменено 21 декабря, 2019 пользователем beketata Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 21 декабря, 2019 Опубликовано 21 декабря, 2019 · Жалоба 25 минут назад, beketata сказал: Линкер выдает предупреждение:Warning[w46]: External function "swap_bits" in module ... has no global definition А если заглянуть в листинг си-файла - как там эта swap_bits называется? Может она там называется _swap_bits? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beketata 0 21 декабря, 2019 Опубликовано 21 декабря, 2019 (изменено) · Жалоба В листинге и в MAP файле название функции без подчеркивания. Тут дело не в этом. Линкер эту функцию находит, линкует и программа в итоге работает. Но хотелось бы избавиться от этого предупреждения. Можно, конечно, добавить в опции линкера "-w46", но как-то это не комильфо. Изменено 21 декабря, 2019 пользователем beketata Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 21 декабря, 2019 Опубликовано 21 декабря, 2019 · Жалоба тогда смотреть листинги других сишных функций и по ним угадывать параметры директивы $DEFFN. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться