首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用__declspec(dllexport)出错:未知类型名称'__declspec‘

使用__declspec(dllexport)出错:未知类型名称'__declspec‘
EN

Stack Overflow用户
提问于 2018-11-15 01:29:21
回答 2查看 3.1K关注 0票数 2

我正在尝试使用NDK从c++导出一个函数到共享对象(c++),使用macOS mojave上的终端。我已经安装了命令行工具和Xcode的最新版本。

这是我想出口的GetNumber()

代码语言:javascript
复制
#include <iostream>
#define DllExport __declspec(dllexport)

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

使用NDK编译代码后,将引发以下错误:

我尝试了clang和Xcode编译器,以及在Windows和Ubuntu上尝试了相同的模式。我也会犯同样的错误。

教程我按照教程使用ndk导出共享库

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-15 01:36:45

你应该在安卓平台上使用JNIEXPORT而不是DllExport

您在问题中提供的参考教程对于当前的Android开发来说太老了。

票数 4
EN

Stack Overflow用户

发布于 2018-11-15 02:04:42

通常,如果您想要在跨平台构建上使用解密规范,那么在给定项目ABC的情况下,您将得到类似于这样的松散内容

在dll构建期间,执行导出的Windows项目声明如下:

代码语言:javascript
复制
#define ABC_EXPORT

所有计划与项目的lib版本(以及项目本身的lib版本)交互的非Windows项目或项目都声明:

代码语言:javascript
复制
#define ABC_LIB

那么你在你的项目中:

代码语言:javascript
复制
#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

然后,您的所有函数声明如下:

代码语言:javascript
复制
ABC_API void foo();

更好的是,如果您有一个操作系统强制层,您可以使用另一个#define而不是__declspec来完全确保POSIX构建不必担心这些东西。

我强烈建议使用导出文件,因为这并不有趣。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53311182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档