Процесс по шагам, На примере кода STM32_USB_Host_Library из STM32Cube_FW_F4_V1.24.0:
1. Создайте пустой проект через меню Project -> Create New Project... -> Empty Project -> OK.
IAR запросит ввести имя файла для проекта (файл с расширением *.ewp). Укажите короткое, но понятное имя, отрающее назначение будущей библиотеки. Например, для библиотеки хоста USB STM32 (STM32_USB_Host_Library) я указал имя USBhost, и сохранил этот файл в корневом каталоге библиотеки.
2. Откройте опции проекта.
В разделе General Options -> Output выберите радиокнопку Library. Как вариант, можно указать папку, куда будет сохранен выходной файл компилируемой библиотеки. Я обычно указываю этот путь относительно каталога проекта $PROJ_DIR$, см. скриншот:
3. Выберите тип процессора, для которого компилируете библиотеку, для чего перейдите в раздел General Options -> Target. Переключите радиокнопку "Processor variant" на Device, и с помощью кнопки выберите тип микроконтроллера (ST -> STM32F4 -> STM32F429 ->STM32F429ZI).
Закройте окно опций проекта кнопкой OK.
4. Добавите в проект все необходимые файлы библиотеки.
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)" добавьте недостающие символы.
Снова скомпилируйте проект. В случае появления ошибок поиска заголовочных файлов повторите шаг 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/ и галочками тонкой настройки позволяют указать необходимую опимизацию, выполняемую компилятором.
Как обычно, когда разрабоатываемое приложение еще отлаживается, полезно выбрать уровень оптимизации None, тогда будут полностью доступны все символы библиотеки и отладка по её исходному коду. Если же разработка близка к завершению, обычно выбирают уровень оптимизации High -> Speed (оптимизация по скорости) или High -> Size (оптимизация по размеру).
Примечание: качественно написанный код должен одинаково хорошо работать как с включенной, так и с выключенной оптиммизацией. Переключение уровня оптимизации в общем случае хорошее средство выявления багов и узких мест в коде. Обычная ситуация - проект с отключенной оптимизацией работает, а со включенной оптимизацией не работает. Тогда разделение проекта на отдельно компилируемые библиотеки дает способ определить, какая часть кода критична к оптимизации, а какая нет.
9. Можно настроить две конфигурации проекта библиотеки - одну для отладки (Debug), другую для релиза (Release). По умолчанию при создании пустого проекта автоматически создаются эти две конфигурации Debug и Release (диалог конфигураций открывается через Project -> Edit Configurations...):
Одна из конфигураций Debug у нас уже настроена. Теперь для настройки конфигураци и Release нужно её выбрать, и настроить в ней все необходимые опции, повторив шаги 2, 3, 5, 6. Это довольно утомительный процесс, даже с учетом того, что можно копировать опции через буфер обмена.
Но есть способ поступить проще - удалить конфигурацию Release и создать её заново на основе конфигурации Debug, при этом все опции скопируются автоматически. Останется выбрать только уровень оптимизации. Для этого откройте диалог Project -> Edit Configurations..., удалите конфигурацию Release (кнопкой Remove, при этом текущей должна быть конфигурация Debug). После этого нажмите кнопку New... введите имя конфигурации (например Release) и создайте её на основе конфигурации Debug, нажав кнопку OK:
В созданной конфигурации придется заново повторить ввод выходной директории (раздел General Options -> Output, поле ввода Executables/libraries), и настроить оптимизацию (C/C++ Compiler -> Optimizations) и отключить вывод отладочной информации (C/C++ Compiler -> Output, снять галочку "Generate debug information").
Комментарии
microsin: по указанным симптомам ничего посоветовать не могу. Обычно все работает тупо и просто - если есть вызов объекта библиотеки, то линкер берет оттуда код, а если нет, то код просто не вставляется. Независимо от того, подключена библиотека к проекту, или нет.
RSS лента комментариев этой записи