IAR使用不同的#define构建库

时间:2017-06-02 13:24:20

标签: c static-libraries iar .a stm8

我将在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来选择函数?

1 个答案:

答案 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
}

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