七牛C-SDK中,QINIU_ACCESS_KEY和QINIU_SECRET_KEY应该怎么赋值?

如果这两个是导出的变量,在qiniu.def中不是应该写成下面那样吗?

EXPORTS
    QINIU_ACCESS_KEY DATA
    QINIU_SECRET_KEY DATA

但是我看了一下C-SDK的源码,里面是没有“DATA”关键字的。

这不是重点,我想问的是,在C++中引用七牛SDK,应该怎么给QINIU_ACCESS_KEY和QINIU_SECRET_KEY这两个变量赋值?
我试过以下方法,无效:

1. 在没有添加任何extern_declspec( dllimport )等语句的情况下,我直接用下面方法赋值:(这也是七牛文档例子代码中的用法)

extern "C"
{
#include "qiniu/conf.h"
#include "qiniu/rs.h"
#include "qiniu/io.h"
}

void MyClass:setQiniuKey()
{
    QINIU_ACCESS_KEY = KQiniuAK; //全局变量
    QINIU_SECRET_KEY = KQiniuSK; //全局变量
}

编译、链接都没问题,但是运行到赋值这里的时候,异常提示:0x00401447 处未处理的异常: 0xC0000005: 写入位置 0x0040fe72 时发生访问冲突

2. 后来我在该cpp文件前面加了下面两句:

extern "C"
{
    extern const char* QINIU_ACCESS_KEY;
    extern const char* QINIU_SECRET_KEY;
}

运行,结果同上,还是访问冲突。

3. 参考了这篇文章之后,改为:

extern "C"
{
extern const char* _declspec(dllimport) QINIU_ACCESS_KEY;
extern const char* _declspec(dllimport) QINIU_SECRET_KEY;
}

这下编译都通不过了,提示:error C2059: 语法错误 : “__declspec(dllimport)”

那么请问,引用七牛C-SDK,正确给这两个变量赋值的完整步骤是什么?谢谢。

阅读 6.1k
2 个回答

https://github.com/qiniu/c-sdk/tree/develop/docs

参考这篇使用文档:

C-SDK 的 conf.h 文件中声明了对应的两个变量:QINIU_ACCESS_KEYQINIU_SECRET_KEY。你需要在启动程序之初初始化这两个变量为七牛颁发的 AccessKeySecretKey

请问你用的是C-SDK还是CPP-SDK?
如果是前者,那么qiniu.def里确实应该在相关定义处加上DATA提示符,否则链接器会认为这两个符号是函数链接而非变量链接,进而导致现象1。
也就是说,你最初的判断是正确的,所以值得先重试一下。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题