簡體   English   中英

IAR構建庫具有不同的#define

[英]IAR build library with different #define

我將在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部分。 我如何構建library.a,可以讓用戶通過在頭文件中編寫#define來選擇函數?

.a文件是在用戶決定硬性或軟性spi之前構建的,因此您不能這樣做。 您必須構建兩個代碼路徑。 將庫作為源存在問題嗎?

考慮到您使用的是8位MCU,我假設您不想弄亂帶有函數指針的大型抽象,因此對代碼路徑的所有選擇都必須在提供的標頭中進行。 如果您的編譯器支持C99,則可以在標頭中內聯放置在實現之間切換的函數:

/* library.h */

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

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

考慮到現在兩個代碼路徑都已添加到您的庫中,您可能希望使用每個函數在單獨的部分中對其進行編譯,然后在鏈接期間刪除所有未使用的部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM