c - IAR 使用不同的 #define 构建库

标签 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部分。如何通过在头文件中编写#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/

相关文章:

c - 定义返回不兼容类型但无法访问的函数

c - 如何从文本文件中恢复信息

c - 在静态库中嵌入资源 - C/C++

swift - 为什么 Swift 不支持 iO 中的静态库

visual-studio-2010 - 使用 Visual Studio C++ 2010 中的命令行创建 DLL 和 LIB 文件

c++ - 使用通用运算符->* 作为右值

c - 函数指针 IAR (typedef void)

c - 在结构中使用 typedef 枚举并避免类型混合警告

c - 如何停止从套接字读取

c - 两个负数的按位和