IAR: создание библиотеки Печать
Добавил(а) microsin   

Прекомпилированные библиотеки, которые созданы из модулей кода, полезно использовать в больших проектах для ускорения процесса компиляции. В библиотеки целесообразно поместить код, который не меняется в настоящий момент (когда идет работа над чем-то другим). В составе IAR есть обстоятельная документация "IAR Runtime Environment and Library User Guide" [1], однако это руководство довольно большое и сложное для изучения. Здесь представлены простые инструкции - как в проекте использовать заранее скомпилированный код в виде библиотек (prebuild library), чтобы помногу раз не перекомпилировать одни и те же файлы и экономить время разработки.

[Как создать библиотеку в IAR]

1. Создайте проект, куда добавьте модули исходного кода, которые должны быть помещены в библиотеку (меню Project -> Create New Project... -> C -> main -> OK -> укажите имя файла проекта и выберите папку, куда он будет сохранен). Удалите из проекта модуль main.c, который был создан автоматически, и добавьте в проект все модули кода, которые должны быть помещены библиотеку. Настройки нового проекта для библиотеки будут во многом копировать настройки других Ваших проектов - нужно выбрать тип процессора, уровень оптимизации, прописать пути поиска заголовков и проч.

Как вариант, можно создать пустой проект, и потом его настроить на создание библиотеки.

Процесс по шагам, На примере кода STM32_USB_Host_Library из STM32Cube_FW_F4_V1.24.0:

1. Создайте пустой проект через меню Project -> Create New Project... -> Empty Project -> OK.

IAR create lib01

IAR запросит ввести имя файла для проекта (файл с расширением *.ewp). Укажите короткое, но понятное имя, отрающее назначение будущей библиотеки. Например, для библиотеки хоста USB STM32 (STM32_USB_Host_Library) я указал имя USBhost, и сохранил этот файл в корневом каталоге библиотеки.

IAR create lib02

2. Откройте опции проекта.

IAR create lib03

В разделе General Options -> Output выберите радиокнопку Library. Как вариант, можно указать папку, куда будет сохранен выходной файл компилируемой библиотеки. Я обычно указываю этот путь относительно каталога проекта $PROJ_DIR$, см. скриншот:

IAR create lib04

3. Выберите тип процессора, для которого компилируете библиотеку, для чего перейдите в раздел General Options -> Target. Переключите радиокнопку "Processor variant" на Device, и с помощью кнопки выберите тип микроконтроллера (ST -> STM32F4 -> STM32F429 ->STM32F429ZI).

IAR create lib05

Закройте окно опций проекта кнопкой OK.

4. Добавите в проект все необходимые файлы библиотеки.

IAR create lib06

5. Теперь нужно настроить пути поиска заголовочных файлов для препроцессора. Для этого попробуйте скомпилировать проект. Конечно, компилятор может не найти некоторые необходимые заголовочные файлы, и в консоли сборки Build покажет соответствующие сообщения, например:

Changed settings forces a full rebuild...
Building configuration: USBhost - Debug
Updating build tree...
0  file(s) deleted.
Updating build tree...
usbh_ioreq.c Fatal Error[Pe1696]: cannot open source file "usbh_ioreq.h" D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Core\Src\usbh_ioreq.c 22 searched: "D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Core\Src\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\c\" current directory: "C:\Users\Andrey\Desktop" Error while running C/C++ Compiler usbh_core.c Fatal Error[Pe1696]: cannot open source file "usbh_core.h" D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Core\Src\usbh_core.c 23 searched: "D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Core\Src\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\c\" current directory: "C:\Users\Andrey\Desktop" Error while running C/C++ Compiler usbh_msc_scsi.c Fatal Error[Pe1696]: cannot open source file "usbh_msc.h" D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Class\MSC\Src\usbh_msc_scsi.c 28 searched: "D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Class\MSC\Src\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\c\" current directory: "C:\Users\Andrey\Desktop" Error while running C/C++ Compiler usbh_msc_bot.c Fatal Error[Pe1696]: cannot open source file "usbh_msc_bot.h" D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Class\MSC\Src\usbh_msc_bot.c 28 searched: "D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Class\MSC\Src\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\c\" current directory: "C:\Users\Andrey\Desktop" Error while running C/C++ Compiler usbh_ctlreq.c Fatal Error[Pe1696]: cannot open source file "usbh_ctlreq.h" D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Core\Src\usbh_ctlreq.c 22 searched: "D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Core\Src\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\c\" current directory: "C:\Users\Andrey\Desktop" Error while running C/C++ Compiler usbh_msc.c Fatal Error[Pe1696]: cannot open source file "usbh_msc.h" D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Class\MSC\Src\usbh_msc.c 41 searched: "D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Class\MSC\Src\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\c\" current directory: "C:\Users\Andrey\Desktop" Error while running C/C++ Compiler usbh_pipes.c Fatal Error[Pe1696]: cannot open source file "usbh_pipes.h" D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Core\Src\usbh_pipes.c 21 searched: "D:\asm\radiopager\Middlewares\ST\STM32_USB_Host_Library\Core\Src\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\" searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\c\" current directory: "C:\Users\Andrey\Desktop" Error while running C/C++ Compiler
Total number of errors: 7 Total number of warnings: 0

Снова откройте опции проекта, и в разделе C/C++ Compiler -> Preprocessor, в область ввода "Additional include directories: (one per line)" добавьте строки путей поиска заголовочных файлов, например:

$PROJ_DIR$\..\..\..\Middlewares\ST\STM32_USB_Host_Library\Core\Inc
$PROJ_DIR$\..\..\..\Middlewares\ST\STM32_USB_Host_Library\Class\MSC\Inc
$PROJ_DIR$\..\..\..\Inc
$PROJ_DIR$\..\..\..\Drivers\CMSIS\Device\ST\STM32F4xx\Include
$PROJ_DIR$\..\..\..\Drivers\CMSIS\Include
$PROJ_DIR$\..\..\..\Drivers\STM32F4xx_HAL_Driver\Inc
$PROJ_DIR$\..\..\..\Drivers\BSP
$PROJ_DIR$\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS
$PROJ_DIR$\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\include
$PROJ_DIR$\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\portable\IAR\ARM_CM4F

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

6. На определенном этапе компиляции могут возникнуть другие ошибки, связанные с отсутствием в проекте некоторых символов, например определений типа процессора. Например:

usbh_msc_scsi.c
Fatal Error[Pe035]: #error directive: "Please select first the target STM32F4xx device
used in your application (in stm32f4xx.h file)"
D:\asm\radiopager\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h 191
Error while running C/C++ Compiler

Снова откройте опции проекта, и снова перейдите в раздел C/C++ Compiler -> Preprocessor. В область ввода "Define symbols: (one per line)" добавьте недостающие символы.

IAR create lib07

Снова скомпилируйте проект. В случае появления ошибок поиска заголовочных файлов повторите шаг 5.

7. В результате проект скомпилируется без ошибок, например:

Building configuration: USBhost - Debug
Updating build tree...
8 file(s) deleted. Updating build tree... usbh_msc_scsi.c usbh_ctlreq.c usbh_msc_bot.c usbh_core.c usbh_msc.c usbh_ioreq.c usbh_pipes.c Building library
Total number of errors: 0

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

[Дополнительные настройки]

8. Можно настроить для библиотеки дополнительный уровень оптимизации кода, для чего перейдите в раздел опций C/C++ Compiler -> Optimizations. Радиокнопка Level вместе с выпадающим списком Balanced/Size/Speed/ и галочками тонкой настройки позволяют указать необходимую опимизацию, выполняемую компилятором.

IAR create lib08

Как обычно, когда разрабоатываемое приложение еще отлаживается, полезно выбрать уровень оптимизации None, тогда будут полностью доступны все символы библиотеки и отладка по её исходному коду. Если же разработка близка к завершению, обычно выбирают уровень оптимизации High -> Speed (оптимизация по скорости) или High -> Size (оптимизация по размеру).

Примечание: качественно написанный код должен одинаково хорошо работать как с включенной, так и с выключенной оптиммизацией. Переключение уровня оптимизации в общем случае хорошее средство выявления багов и узких мест в коде. Обычная ситуация - проект с отключенной оптимизацией работает, а со включенной оптимизацией не работает. Тогда разделение проекта на отдельно компилируемые библиотеки дает способ определить, какая часть кода критична к оптимизации, а какая нет.

9. Можно настроить две конфигурации проекта библиотеки - одну для отладки (Debug), другую для релиза (Release). По умолчанию при создании пустого проекта автоматически создаются эти две конфигурации Debug и Release (диалог конфигураций открывается через Project -> Edit Configurations...):

IAR create lib09

Одна из конфигураций Debug у нас уже настроена. Теперь для настройки конфигураци и Release нужно её выбрать, и настроить в ней все необходимые опции, повторив шаги 2, 3, 5, 6. Это довольно утомительный процесс, даже с учетом того, что можно копировать опции через буфер обмена.

Но есть способ поступить проще - удалить конфигурацию Release и создать её заново на основе конфигурации Debug, при этом все опции скопируются автоматически. Останется выбрать только уровень оптимизации. Для этого откройте диалог Project -> Edit Configurations..., удалите конфигурацию Release (кнопкой Remove, при этом текущей должна быть конфигурация Debug). После этого нажмите кнопку New... введите имя конфигурации (например Release) и создайте её на основе конфигурации Debug, нажав кнопку OK:

IAR create lib10

В созданной конфигурации придется заново повторить ввод выходной директории (раздел General Options -> Output, поле ввода Executables/libraries), и настроить оптимизацию (C/C++ Compiler -> Optimizations) и отключить вывод отладочной информации (C/C++ Compiler -> Output, снять галочку "Generate debug information").

2. Откройте свойства проекта, перейдите в раздел General Options, выберите закладку Output. Переставьте радиокнопку Output file в положение Library.

3. Скомпилируйте проект. По умолчанию выходной файл библиотеки создастся в папке Debug\Exe, и файл получит имя проекта и расширение *.a. Это и есть прекомпилированный файл библиотеки. Теперь его нужно добавить в тот проект.

[Как добавить библиотеку в проект вместо модулей исходного кода]

1. Удалите из проекта все файлы модулей, которые были перенесены библиотеку. Проще всего, когда эти модули в проекте содержатся в отдельной папке. Тогда достаточно просто отключить от процесса компиляции в проекте папку с этими модулями, не удаляя их из проекта (впоследствии всегда можно их подключить обратно). Щелкните в дереве проекта правой кнопкой на папке, которую хотите отключить от компиляции, выберите Options... и поставьте галочку Exclude from build. Теперь эти модули компилироваться не будут. Код из этих модулей будет браться из библиотеки.

2. В проекте, куда хотите добавить библиотеку, зайдите в свойства проекта через меню Project -> Options, перейдите в раздел Linker -> закладка Library, и в поле Additional libraries добавьте полный путь до файла библиотеки. Не стесняйтесь использовать макросы IAR типа $PROJ_DIR$, чтобы удалить привязку к абсолютным путям. Например, путь до файла библиотеки может быть наподобие следующего:

$PROJ_DIR$\..\..\precompiled-IAR-libs\efsl-lib\Debug\Exe\efsllibprj.a

3. Перекомпилируйте проект с добавленной библиотекой. Он должен скомпилироваться без ошибок.

[Ссылки]

1. IAR Runtime Environment and Library User Guide site:supp.iar.com.