Ошибка при использовании __declspec (dllexport): неизвестное имя типа '__declspec' - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь экспортировать функцию в общий объект (.so), используя NDK из c ++, используя терминал в macOS mojave.Я установил последние версии инструмента командной строки и Xcode.

Вот мой GetNumber(), который я хочу экспортировать

#include <iostream>
#define DllExport __declspec(dllexport)

extern "C" {
   DllExport int GetNumber() {
      return 5 ;
   }
} 

После компиляции кодаиспользуя NDK, он выдает следующую ошибку ,

enter image description here

Я опробовал компилятор clang и Xcode, а также пробовал те же шаблоны в Windows иУбунту.У меня та же ошибка

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Обычно, если вы хотите использовать declspec в кроссплатформенных сборках, вы получите что-то в этом роде, учитывая проект ABC:

Проект Windows, выполняющий экспорт, объявляет так же во время dllbuilds:

#define ABC_EXPORT

Все не-Windows проекты или проекты, которые планируют взаимодействовать с lib-версией проекта (и lib-версией самого проекта), объявляют:

#define ABC_LIB

тогда у вас есть в вашем проекте:

#ifdef ABC_LIB //or #if (defined(ABC_LIB) || !defined(WIN32))
  #define ABC_API
#else
  #ifdef ABC_EXPORT 
    #define ABC_API __declspec(dllexport)
  #else
    #define ABC_API __declspec(dllimport)
  #endif
#endif

Тогда все ваши функции объявлены следующим образом:

ABC_API void foo();

Еще лучше, если у вас есть уровень абстракции ОС, вы можете использовать другой #defineвместо __declspec для полной гарантии того, что сборки POSIX никогда не должны беспокоиться об этом.

Я настоятельно рекомендую вместо этого использовать экспортные файлы, потому что это не весело.

0 голосов
/ 15 ноября 2018

Вы должны использовать JNIEXPORT вместо DllExport на платформах Android.

Ссылка на учебник, который вы указали в своем вопросе, устарела для текущей разработки Android NDK.

...