Использование #ifdef в статических библиотеках (C ++, Eclipse CDT) - PullRequest
0 голосов
/ 21 мая 2018

У меня есть вопрос, касающийся управления моим проектом в 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 голосов
/ 22 мая 2018

Есть много способов выполнить то, что вы хотите, но следует отметить, что если драйверы для обоих MCU имеют одинаковый интерфейс (согласно вашему вопросу), то было бы абсолютно бессмысленно включать разные заголовки на основе разных MCU.#defines.Если вы хотите, чтобы решение основывалось на #define, вы можете, например, сделать:

Заголовок (some_driver.h):

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

// start driver
void some_driver_start();

Реализация "Fake" (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
}

... ии так далее.

...