我有一个关于我在 Eclipse CDT 中的项目管理、C++ 编程和使用 GCC 编译的问题。 假设我有一个用于 A 型微 Controller 的驱动程序库 (driverA.hpp) 和一个用于 B 型微 Controller 的驱动程序库 (driverB.hpp)(外围设备等)。在这两个库中,函数接口(interface)是相同的。此外,我有某些设备的库,如设备 X,它应该可用于两种 Controller 类型(例如:deviceX.hpp)。在使用这些东西的项目 (projectY) 中,我将添加相应的驱动程序库(driverA.hpp 或 driverB.hpp)并且我想添加一个编译器标志以命名我想使用的 Controller 类型。
在deviceX.hpp中,我想区分这两种类型,所以我想添加这样的东西:
#ifdef CONTROLLER_A
#include driverA.hpp
#elseif CONTROLLER_B
#include driverB.hpp
#endif
这个库也将链接到 projectY,我想在其中添加一个编译器标志,如 CONTROLLER_A,并且将链接具有正确 Controller 类型的库 deviceX。
但是,我知道,这是行不通的。这就是为什么我要问你:做这种库依赖的最好(或:常见)的方法是什么?添加 deviceX 库作为源位置?还是有别的办法?
最好的问候
最佳答案
有很多方法可以实现您想要的,但需要注意的一件事是,如果两个 MCU 的驱动程序具有相同的接口(interface)(根据您的问题),那么包含基于不同 MCU 的不同 header 绝对没有意义#定义。如果您希望解决方案基于#define,您可以执行以下操作:
header (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
}
...等等。
关于c++ - 在静态库(C++、Eclipse CDT)中使用#ifdef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50456500/