Я пытаюсь включить скомпилированную библиотеку в проект C на скандинавском nrf52840. Ниже (насколько я понимаю) есть способ ссылки на некоторые методы foo
а также bar
в пределах .lib
файл для остальной части проекта. При попытке скомпилировать это с Segger Embedded Studio я получаю следующее expected '=', ',', ';', 'asm' or '__attribute__' before 'int'
ошибка со следующим фрагментом кода:
#ifndef _FOOBAR_SERVICE_H_
#define _FOOBAR_SERVICE_H_
#if (defined(__linux__) || defined(__APPLE__) || defined(ARDUINO) ||
defined(__MSP430FR5969__))
#define IMPORT __attribute__ ((visibility ("default")))
#define EXPORT __attribute__ ((visibility ("default")))
#define LOCAL __attribute__ ((visibility ("hidden")))
#elif defined(_WIN32)
#define EXPORT __declspec(dllexport)
#endif
#include <stdbool.h>
#ifdef __cplusplus
extern "C"{
#endif
EXPORT int ble_foo(unsigned char *a, unsigned char *buffer); //<--(error)
EXPORT int ble_bar(unsigned char *b, unsigned char *buffer); //<--(same error)
#ifdef __cplusplus
}
#endif
#endif /* _FOOBAR_SERVICE_H_ */
Выше #include "foobar_ble.h"
включены в мой main.c
файл.
Частично это может быть моим недоразумением extern "C"
Я считаю, что это способ компиляции кода на Си. Я верю #ifdef __cplusplus
проверяет компиляцию как c ++, значит ли это, что extern "C"
даже не используется в среде C?
Кроме того, я не могу найти хорошее объяснение EXPORT
ключевое слово в C. Это также может быть источником моих проблем.
Tl; dr: Слишком тупой, слишком много вопросов, нужна помощь. Plz & Благодарю.
Я думаю, что проблема в том, что EXPORT
в вашем случае ничего не определено. Так что он просто останется в исходном коде и вызовет синтаксическую ошибку. Вероятно, он предназначен для определения чего-то вроде __declspec (dllexport) в статических библиотеках и ничего (пустая строка) для статического использования.
Вы должны быть в состоянии исправить это, определив EXPORT
в пустую строку. В зависимости от библиотеки может быть место для этого в некотором файле заголовка конфигурации. В противном случае вы также можете использовать определение на уровне вызова компилятора, но это не может быть предпочтительным, так как удаляет все EXPORT
слова из исходного кода.
Других решений пока нет …