0

我正在尝试将已编译的库包含到 Nordic nrf52840 上的 C 项目中。下面(据我所知)是一种链接到项目其余部分的一些方法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"我认为它是一种编译 C 代码的方式的误解。我相信#ifdef __cplusplus正在检查以编译为 C++ 那么这是否意味着它extern "C"甚至没有在 C 环境中使用?

此外,我似乎无法EXPORT在 C 中找到关键字的良好解释。这也可能是我的问题的根源。

Tl; dr:太笨了,问题太多,需要帮助。请和谢谢。

4

1 回答 1

3

我认为问题是EXPORT在你的情况下没有定义任何东西。所以它只会留在源代码中并导致语法错误。它可能打算在静态库上定义为 __declspec(dllexport) 之类的东西,而在静态使用时没有(空字符串)。

您应该能够通过定义EXPORT为空字符串来修复它。根据库的不同,在某些配置头文件中可能会有一个位置。否则,您也可以在编译器调用级别上使用定义,但这可能不是可取的,因为它会EXPORT从源代码中删除所有单词。

于 2018-08-31T20:46:57.883 回答