Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Shamrel
79 / 78 / 15
Регистрация: 11.03.2016
Сообщений: 197
#1

IAR компиляция библиотек

19.01.2018, 11:41. Просмотров 266. Ответов 8
Метки нет (Все метки)

Можно ли при компиляции библиотек управлять тем, какие функции будут экспортированы?
Понятно, что спецификатор static для того и предназначен, но как быть если исходный код библиотеки размещен в нескольких *.с файлах, с определенной иерархии вызовов, при этом в библиотеке должны быть функции только из одного *.с фала?

P.S.: При написании dll под Win проблема решалась с помощью __declspec(dllexport). Может что-то есть такое и в IAR?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2018, 11:41
Ответы с готовыми решениями:

IAR Подключение своиз библиотек
Стою в ступоре. Помогите. Начал ковырять IAR и тут же затык. Проблема с...

Переделка кода из IAR в код "любителей библиотек"
Сколько пишу код - не могу понять, как писать код с помощью готовых библиотек....

IAR
Люди, у кого ИАР версии 5.20.4 или выше, выложите пожалуйста папки config и yms...

IAR Stack
Постоянно жалуется IAR что стек заполнен на 100% процентов. Увеличил стек с 256...

IAR for 8051
Доброе здрасьти. До недавнего времени писал код на асме в студии Raisonance...

8
ValeryS
Модератор
7219 / 5482 / 682
Регистрация: 14.02.2011
Сообщений: 18,543
19.01.2018, 19:13 #2
создай H файл для внешней связи

Добавлено через 8 минут
Цитата Сообщение от Shamrel Посмотреть сообщение
При написании dll под Win проблема решалась
а как ты lib писал
0
Shamrel
79 / 78 / 15
Регистрация: 11.03.2016
Сообщений: 197
19.01.2018, 20:01  [ТС] #3
Цитата Сообщение от ValeryS Посмотреть сообщение
создай H файл для внешней связи
Не совсем понял совет. Для того чтобы подключить скомпилированную библиотеку к другому проекту, естественно создается заголовочный файл с описанием экспортируемых функций. Но даже если я в нем укажу только те объекты, которые мне нужны, в самой библиотеке останутся все остальные объекты. Проблема в едином пространстве имен. Скажем, в библиотеке используется файл, куда вынесены все вспомогательные функции, например crc_calc(), естественно, экспортировать ее не требуется, и в заголовочный файл ее прототип не пойдет. Однако же в самом файле библиотеке она будет содержаться в публичном виде, а не в приватном (если в терминах с++), и линкер основного проекта имеет право ее задействовать. Это может привести к серьезным и плоходиагностируемым ошибкам. Блин, кажется пора и для микроконтроллерам переходить на плюсы ...

Цитата Сообщение от ValeryS Посмотреть сообщение
а как ты lib писал
Я системный программист и часто для того, чтобы передать железяку программисту прикладному удобно все взаимодействие с железом оформить в виде dll (если win) или so (если линь.) А они уже в своих красивостях используют мой отлаженный код, не вдаваясь в подробности как там все устроено. Если интересно как это делать, могу дать ссылку на репозиторий. Часть проектов открыты под BSD (но в силу специфичности никому не нужны )
0
ValeryS
Модератор
7219 / 5482 / 682
Регистрация: 14.02.2011
Сообщений: 18,543
19.01.2018, 20:45 #4
Цитата Сообщение от Shamrel Посмотреть сообщение
Однако же в самом файле библиотеке она будет содержаться в публичном виде, а не в приватном (если в терминах с++), и линкер основного проекта имеет право ее задействовать.
библиотека это уже скомпилированый объектный файл и соглашение имен в стиле Си уже не действуют
или ты библиотеку в исходных кодах поставляешь7
Цитата Сообщение от Shamrel Посмотреть сообщение
формить в виде dll (если win)
это динамическая библиотека, а так же в вин есть и статические библиотеки это есть lib
0
Shamrel
79 / 78 / 15
Регистрация: 11.03.2016
Сообщений: 197
20.01.2018, 07:07  [ТС] #5
Цитата Сообщение от ValeryS Посмотреть сообщение
библиотека это уже скомпилированый объектный файл и соглашение имен в стиле Си уже не действуют
или ты библиотеку в исходных кодах поставляешь7
Че-то я не до понимаю.
После компиляции библиотеки в IAR на выходе появляется *.a файл. Он составляется из нескольких объектных файлов .о, которые компилируются независимо друг от друга из соответствующих файлов *.с.
Утилита сборки (в IAR это iarchive) ничего не знает о том, какие функции из файлов типа *.о являются публичными, а какие приватными, также она ничего не знает о заголовочном файле, где я опишу прототипы публичных функций для использования библиотеки *.а в другом проекте. В результате в файле *.а все объекты доступны из вне и могут быть использованы линкером.

P.S.: У IAR нашел жуткий способ как решить эту проблему: Hiding symbols in a library using isymexport
0
Voland_
1652 / 998 / 96
Регистрация: 04.01.2010
Сообщений: 3,301
20.01.2018, 15:05 #6
Что-то я не понял, о каких "приватных" функциях идет речь, в контексте языка Си, но проблема в целом вполне интересна ).

Вот что можно добавить:
1) Насчет библиотеки и "расшаренных имен функций". При линковке объектников в отдельности или библиотеки в целом, есть несколько вариантов. Компилер может воткнуть всё из объектников и библиотеки, может удалить с помощью функции оптимизации неиспользуемые функции (часто впихивается весь объектник, даже если из него вызывается только одна функция). Это все зависит от продвинутости линкера. Некоторые линкеры, поговаривают, могут даже выкинуть некоторые куски кода, получая константы на этапе линковки, не говоря уже об оптимизации, например, коротких/длинных переходов, веенеров и т.д. Все это давно уже доступно.

Кстати, из-за длинных/коротких переходов - на этапе линковки иногда даже последовательность файлов как они "укладываются" в память - тоже влияет на код. (ходят слухи, что некоторые шибко умные компилеры и это умеют).

2) В СИ расшареные функции имеют обычное объявление, без никаких приставок. Если же вы хотите что-то "припрятать", в рамках библиотеки, но не хотите это использовать - можно объявить "static inline" функцию, и в библе она не появится.

ЗЫ: вообще, комбинация static и inline (always inline) дает оч. много разных вариантов, которые зависят тогда уже как от кода, библиотеки, так и, в основном варианте - от компилятора. И для библиотек это очень актуальный вопрос.

Насчет источников комментов - это GCC в основном. Возможно, это не относится к IAR, но тем не менее, имеет общие черты.

Добавлено через 6 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
библиотека это уже скомпилированый объектный файл
я уже об этом озвучил чуть выше, но уточню - на сегодня из-за мощных оптимизаторов, объектник представляет собой разве что "остов" программы на асме. Потому что переходы в нем обозначены (ссылок-то все равно нет, там нули). И после только окончательной линковки с оптимизацией вы получите "застывший код". Потому что оптимизатор запросто может перетасовать применяемые регистры в функциях, поменять функции переходов, вызовов и даже флаги условий... Но получив наконец-то *.elf, в коде "все успокаивается", не смотря на то, что и *.elf можно использовать в линковке с другими проектами, и брать из него имена объектов.

Добавлено через 1 час 4 минуты
Цитата Сообщение от Shamrel Посмотреть сообщение
Понятно, что спецификатор static для того и предназначен, но как быть если исходный код библиотеки размещен в нескольких *.с файлах,
сорри, не внимательно прочитал, вы о static уже говорили
Тут тоже можно добавлять. static (и инлайн) функции часто добавляются в хидеры. То есть функция тогда добавляется в "более другие" исходники с этим хидером (который не отдается с библиотекой, например). При этом линкер сам уже себе знает - добавлять эту функцию прямо в месте вызова, или разместить один раз код - и вызывать из разных мест... Но навряд-ли static будет "шариться" и видеться в списке объектов библиотеки. Неудобство лишь в том, как эту функцию "расшарить" с остальными *.c-файлами.
1
Shamrel
79 / 78 / 15
Регистрация: 11.03.2016
Сообщений: 197
20.01.2018, 18:28  [ТС] #7
Voland_, спасибо! Прямо как детектив читал. "Публичные" и "Приватные" в контексте Си появились из-за ограниченности моего понятийного аппарата. А аналогия, как мне показалось, вполне удачная.

Цитата Сообщение от Voland_ Посмотреть сообщение
Неудобство лишь в том, как эту функцию "расшарить" с остальными *.c-файлами.
Во! В самую точку!
Для себя вижу два очевидных способа решения задачи:
1. Все неэскспортируемые объекты делаем статиком, а перед сборкой помещаем их в один файл.
2. Делать заковыристые имена, что бы резко уменьшить вероятность совпадения имен с объектами из других библиотек.

Первый способ откровенно неудобен в отладке, файлов много, файлы большие. Было бы удобно объединять файлы, если функции писать непосредственно в заголовочном файле, что в принципе практикуется для инлайн, но также имеет ряд минусов, в том числе идеологических.
Второй способ -- полумера.
0
ValeryS
Модератор
7219 / 5482 / 682
Регистрация: 14.02.2011
Сообщений: 18,543
20.01.2018, 18:54 #8
Цитата Сообщение от Shamrel Посмотреть сообщение
Первый способ откровенно неудобен в отладке, файлов много, файлы большие.
так можно создать кучу маленьких файликов а потом их объединить include
C
1
2
3
#include "file1.c"
#include "file2.c"
#include "file3.c"
правда способ так себе
0
Витальич
1269 / 1179 / 174
Регистрация: 02.12.2013
Сообщений: 4,884
20.01.2018, 21:02 #9
http://microsin.net/programming/arm/iar-crate-precompiled-library.html
1
20.01.2018, 21:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2018, 21:02

IAR without Debbuger
Привет ещё раз. Я шью МК через IAR и меня замечало постоянно включать деббагер...

IAR слетает
Работаю с STM32 в среде IAR. Отладчик JetLink-8. В системе только одно...

msp430 IAR
Ребята просьба о помощи, в универе курсовая по микроконтроллерам MSP430,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru