IAR сборка библиотеки с разными #define
Я собираюсь создать простую библиотеку (файл.a) в IAR Workbench для STM8. В этой библиотеке я хочу реализовать аппаратный SPI и программный SPI, чтобы пользователи могли выбирать.
В моем файле library.c я написал:
#include "library.h"
void LibraryInit()
{
#ifdef HARDWARE_SPI
funcToInitHardwareSPI();
#else
funcToInitSoftwareSPI();
#endif
}
И в моем файле library.h я написал:
#ifndef __LIB_H
#define __LIB_H
#define HARDWARE_SPI
void LibraryInit();
#endif
Тогда я думаю, что если пользователь определит #define HARDWARE_SPI
в целевом проекте библиотека будет запускать аппаратную часть SPI. Если нет, следует использовать программный SPI.
Но после того, как я собрал проект и добавил library.a и library.h в тестовый проект, с library.h нет #define HARDWARE_SPI
рутина все еще входит в аппаратную часть SPI. Как я могу создать файл library.a, который позволит пользователю выбрать функцию, написав #define
в заголовочном файле?
1 ответ
.a
Файл строится до того, как пользователь решит жесткие или мягкие программы, поэтому вы не можете. Вы должны создать оба кодовых пути. Есть ли проблема с предоставлением библиотеки в качестве источника?
Учитывая, что вы используете 8-битный mcu, я предполагаю, что вы не хотите связываться с большими абстракциями с указателями на функции, поэтому весь выбор пути кода должен происходить в предоставленном вами заголовке. Если ваш компилятор поддерживает C99, вы можете поместить функции, которые переключаются между реализациями, встроенными в ваш заголовок:
/* library.h */
#pragma once
void funcToInitHardwareSPI();
void funcToInitSoftwareSPI();
inline void LibraryInit()
{
#ifdef HARDWARE_SPI
funcToInitHardwareSPI();
#else
void funcToInitSoftwareSPI();
#endif
}
Учитывая, что оба пути кода теперь добавлены в вашу библиотеку, вы можете скомпилировать их с каждой функцией в отдельном разделе, а затем удалить все неиспользуемые разделы во время компоновки.