我将在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部分。如何构建库.a可以让用户通过在头文件中写#define
来选择函数?
答案 0 :(得分: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
}
考虑到两个代码路径现在都已添加到库中,您可能希望在单独的部分中使用每个函数对其进行编译,然后在链接期间删除所有未使用的部分。