在静态库中使用#ifdef(C ++,Eclipse CDT)

时间:2018-05-21 20:54:48

标签: c++ c eclipse linker microcontroller

我对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库添加为源位置?或者还有另一种方式吗?

最好的问候

1 个答案:

答案 0 :(得分:0)

有很多方法可以实现你想要的东西但有一点要注意的是,如果两个MCU的驱动程序具有相同的接口(根据你的问题),那么根据不同的MCU包含不同的标题绝对没有意义#define语句。如果您希望解决方案基于#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
}

......等等。