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

Using #ifdef in static libraries (C++, Eclipse CDT)

本文关键字:C++ Eclipse CDT #ifdef 静态      更新时间:2023-10-16

我有一个关于我在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 库添加为源位置?还是有别的办法?

此致敬意

有很多方法可以实现您想要的功能,但需要注意的一点是,如果两个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
}

。等等。