0

我将在 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?

4

1 回答 1

0

.a文件是在用户决定硬或软 spi 之前构建的,所以你不能。您必须构建两个代码路径。将库作为源提供有问题吗?

考虑到您使用的是 8 位 mcu,我假设您不想弄乱函数指针的大抽象,因此您的代码路径的所有选择都必须发生在您提供的标头中。如果您的编译器支持 C99,您可以将在实现之间切换的函数内联放置在您的标头中:

/* library.h */

#pragma once
void funcToInitHardwareSPI();
void funcToInitSoftwareSPI();

inline void LibraryInit()
{
#ifdef HARDWARE_SPI
   funcToInitHardwareSPI();
#else
   void funcToInitSoftwareSPI();
#endif
}

考虑到两个代码路径现在都已添加到您的库中,您可能希望在单独的部分中使用每个函数对其进行编译,然后在链接期间删除所有未使用的部分。

于 2017-06-02T14:30:26.163 回答