2017-06-02 5 views
0

STAR8のIAR Workbenchに簡単なライブラリ(.aファイル)を作成します。このライブラリでは、ユーザーが選択できるようにハードウェアSPIとソフトウェアSPIの両方を実装したいと考えています。異なる#defineを持つIARビルドライブラリ

#include "library.h" 

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

をそして、私のlibrary.hに、私が書いた:私のlibrary.cで

は、私が書いた後、ユーザーがターゲットプロジェクトで#define HARDWARE_SPIを定義する場合、私は、考えて

#ifndef __LIB_H 
#define __LIB_H 

#define HARDWARE_SPI 

void LibraryInit(); 

#endif 

ライブラリはハードウェアSPI部分を実行します。そうでない場合は、ソフトウェアSPIを使用する必要があります。

しかし、プロジェクトをビルドしてlibrary.aとlibrary.hをテストプロジェクトに追加した後、library.hには#define HARDWARE_SPIがなく、ルーチンはまだハードウェアSPIの部分に入ります。ライブラリファイル#defineをヘッダファイルに書き込んで、ユーザが関数を選択できるようにするには、どうすればlibrary.aをビルドできますか?

+0

質問には関係ありませんが、2つの先頭のアンダースコア、先頭の1つのアンダースコア、大文字の先頭の記号は使用しないでください。これらのシンボルは、コンパイラおよび標準ライブラリのすべてのスコープで予約されています。 –

+0

@Someprogrammerdudeあなたがいました!基本的なことを教えてくれてありがとう! – SoWaiSam

答えて

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 
} 

が今、あなたのライブラリに追加され、あなたは別々に各機能とそれをコンパイルしたいかもしれませんセクションを開き、リンク中に未使用のセクションをすべて削除します。

+0

答えをありがとう。コンパイラはc99をサポートしていますので、試してみます。一つのことを確かめたいだけです。それらのコードは.hで書かれていますか?または私はまだ.c内の装飾と定義として 'inline void LibraryInit();'のみを.hに入れることができますか?私はそれらのプリプロセッサコマンドに慣れていないので、コードをどのようにコードするかは不明です。設定が複雑すぎるので、私はそれを隠したいと思います。人々がそれを変えすぎてデバッグ時間が長くなりすぎないようにしたいのです。 – SoWaiSam

+0

@SoWaiSamそう、それはヘッダーにあります。コンパイル時に呼び出しを正しい実装に転送する関数は、ヘッダーになければなりません。また、あなたのコードを見えるようにすることは、必ずしも悪いことではないと思います。組み込み機器向けの大規模オペレーティングシステムでも、(フリーソフトウェアではないかもしれませんが)プレーンソースとして提供されているため、すべてを一度にコンパイルして最適化することができます。 – Lanting

+0

また、同じシグネチャを含む2つの '.a'ファイルを用意し、ユーザが必要なものにリンクさせることができます。 – Lanting

関連する問題