首页 > 解决方案 > 在静态库(C++、Eclipse CDT)中使用#ifdef

问题描述

我有一个关于我在 Eclipse CDT 中的项目管理、在 C++ 中编程和使用 GCC 编译的问题。假设我有一个适用于 A 型微控制器 (driverA.hpp) 的驱动程序库和一个适用于 B 型微控制器 (driverB.hpp) 的驱动程序库(外围设备等)。在这两个库中,函数接口是相同的。此外,我有某些设备的库,例如设备 X,它们应该可用于两种控制器类型(例如:deviceX.hpp)。在使用这些东西的项目(projectY)中,我将添加相应的驱动程序库(driverA.hpp 或 driverB.hpp),并且我想添加一个编译器标志以命名我想要使用的控制器类型。

在 deviceX.hpp 中,我想区分这两种类型,所以我想添加如下内容:

#ifdef CONTROLLER_A
  #include driverA.hpp
#elseif CONTROLLER_B
  #include driverB.hpp
#endif

这个库也将链接到 projectY,我想在其中添加一个编译器标志,如 CONTROLLER_A,并且将链接具有正确控制器类型的库 deviceX。

但是,我知道,那是行不通的。这就是为什么我要问你:做这种库依赖的最好(或:常见)方法是什么?将 deviceX 库添加为源位置?还是有其他方法?

此致

标签: c++ceclipselinkermicrocontroller

解决方案


有很多方法可以实现您想要的,但需要注意的一点是,如果两个 MCU 的驱动程序具有相同的接口(根据您的问题),那么基于不同的 MCU #defines 包含不同的标头绝对没有意义。如果您希望解决方案基于#define,您可以例如执行以下操作:

头文件(some_driver.h):

// init.
void some_driver_init(struct init_params ip);

// start driver
void some_driver_start();

“假”实施(some_driver.c):

#if defined(ARM_CORTEX_M3)  
#include "some_driver_arm_m3.c"
#elif defined(TI_MSP430) 
#include "some_driver_msp430.c"
#elif defined(...)  
//... and so on...
#else  
#pragma warning "MCU NOT SUPPORTED!"
#endif 

然后是每个 MCU 的“真正”实现:

some_driver_arm_m3.c

// init. M3 Cortex driver
void some_driver_init(struct init_params ip)
{
// actual M3 implementation goes here
}

// start M3 Cortex driver
void some_driver_start()
{
// actual M3 implementation goes here
}

some_driver_msp430.c

// init. MSP430 driver
void some_driver_init(struct init_params ip)
{
// actual MSP430 implementation goes here
}

// start MSP430 driver
void some_driver_start()
{
// actual MSP430 implementation goes here
}

... 等等。


推荐阅读