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
}

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

Другие вопросы по тегам