Ожидается внешняя ошибка «C»: «=», «,», «;», «asm» или «__attribute__» перед «int» - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь включить скомпилированную библиотеку в проект 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: Слишком тупой, слишком много вопросов, нужна помощь. Плз и спасибо.

1 Ответ

0 голосов
/ 31 августа 2018

Я думаю, что проблема в том, что EXPORT в вашем случае ничего не определено. Так что он просто останется в исходном коде и вызовет синтаксическую ошибку. Вероятно, он предназначен для определения чего-то вроде __declspec (dllexport) в статических библиотеках и ничего (пустая строка) для статического использования.

Вы сможете исправить это, указав EXPORT в пустой строке. В зависимости от библиотеки может быть место для этого в некотором файле заголовка конфигурации. В противном случае вы также можете использовать определение на уровне вызова компилятора, но это не может быть предпочтительным, поскольку оно удаляет все EXPORT слова из исходного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...