我正在尝试将已编译的库包含在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环境中使用?
此外,我似乎无法在C中找到关于EXPORT
关键字的很好的解释。这也可能是我遇到问题的根源。
Tl; dr:太笨了,有太多问题需要帮助。谢谢,谢谢。
答案 0 :(得分:3)
我认为问题在于您的情况下rate
没有定义任何东西。因此,它将仅保留在源代码中并导致语法错误。可能打算将其定义为静态库上的诸如__declspec(dllexport)之类的内容,而对于静态使用则不进行任何定义(空字符串)。
您应该可以通过将EXPORT
定义为一个空字符串来解决此问题。根据库的不同,在某些配置头文件中可能会存在一个位置。否则,您也可以在编译器调用级别上使用定义,但这可能不是可取的,因为它会从源代码中删除所有EXPORT
个单词。