我将在 IAR Workbench 中为 STM8 构建一个简单的库(.a 文件)。在这个库中,我想同时实现硬件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部分。如何通过在头文件中编写#define
来构建让用户选择函数的library.a?
最佳答案
.a
文件是在用户决定硬或软 spi 之前构建的,因此您不能。您必须构建两个代码路径。提供库作为源有问题吗?
考虑到您使用的是 8 位 MCU,我假设您不想用函数指针搞乱大抽象,因此代码路径的所有选择都必须发生在您提供的 header 中。如果您的编译器支持 C99,您可以将在实现之间切换的函数内联放置在 header 中:
/* library.h */
#pragma once
void funcToInitHardwareSPI();
void funcToInitSoftwareSPI();
inline void LibraryInit()
{
#ifdef HARDWARE_SPI
funcToInitHardwareSPI();
#else
void funcToInitSoftwareSPI();
#endif
}
考虑到两个代码路径现在都已添加到您的库中,您可能希望在单独的部分中使用每个函数对其进行编译,然后在链接期间删除所有未使用的部分。
关于c - IAR 使用不同的 #define 构建库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44330071/