如何从 DLL 中导出数组?

Posted

技术标签:

【中文标题】如何从 DLL 中导出数组?【英文标题】:How to export an array from a DLL? 【发布时间】:2013-03-04 10:50:31 【问题描述】:

我无法从 DLL 导出数组。这是我的代码:

“DLL 头”

#ifdef EXPORT
    #define MYLIB __declspec(dllexport)
#else 
    #define MYLIB
#endif


extern "C" 
/* Allows to use file both with Visual studio and with Qt*/
#ifdef __cplusplus
    MYLIB double MySum(double num1, double num2);
    extern MYLIB char ImplicitDLLName[]; 
#else
    extern Q_DECL_IMPORT char ImplicitDLLName[]; 
    Q_DECL_IMPORT double MySum(double num1, double num2);
#endif

“DLL 源”

 #define EXPORT
    #include "MySUMoperator.h"

    double MySum(double num1, double num2)
    
        return num1 + num2;
    

    char ImplicitDLLName[] = "MySUMOperator";

"客户端 main.cpp"

int main(int argc, char** argv)

    printf("%s", ImplicitDLLName);

在构建时,我从链接器收到此错误:

Error   2   error LNK2001: unresolved external symbol _ImplicitDLLName  \Client\main.obj

//我导出数组的目的是研究从DLL中导出不同的数据结构

如何处理链接器报错,违反了哪些规则?

*更新:* IDE Visual Studio 2010。 客户端 - 使用 C++ 编写,DLL 也使用 C++

【问题讨论】:

我认为您需要将 MYLIB 放在数组 definition 中。 @n.m.在你建议之后 - 我试过了,它不起作用 【参考方案1】:

假设您正确链接了您的导入库(这是一个假设),您没有正确声明 MYLIB 以导入符号:

这个:

#ifdef EXPORT
    #define MYLIB __declspec(dllexport)
#else 
    #define MYLIB
#endif

应该是这样的:

#ifdef EXPORT
    #define MYLIB __declspec(dllexport)
#else 
    #define MYLIB __declspec(dllimport)
#endif

请记住,我们几乎没有可以使用的上下文。 看起来您正试图从 C 编译的应用程序中使用它,但如果没有更多信息,我无法确定。如果是这种情况,那么 Q_DECL_IMPORT 最好执行上述操作,否则仍然无法正常工作。我将从一个基本的“C”链接导出开始,然后从那里开始。


EXPORTS.DLL 示例

Exports.h

#ifdef EXPORTS_EXPORTS
#define EXPORTS_API __declspec(dllexport)
#else
#define EXPORTS_API __declspec(dllimport)
#endif

extern "C" EXPORTS_API char szExported[];

Exports.cpp

#include "stdafx.h"
#include "Exports.h"

// This is an example of an exported variable
EXPORTS_API char szExported[] = "Exported from our DLL";

EXPORTSCLIENT.EXE 示例

ExportsClient.cpp

#include "stdafx.h"
#include <iostream>
#include "Exports.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])

    cout << szExported << endl;
    return 0;

输出

Exported from our DLL

【讨论】:

感谢您的回复。我的 dll 中也有函数,它们已成功导出,因此我可以从客户端使用它们。要检查数组是否已导出,我使用了 dumpbin /exports mydllName.dll,它表示数组已导出。据我所知,语句 __declspec(dllimport) 是可选的,可以省略。 @spin_eight 我过去曾尝试过不使用它进行编译,并且根据我的经验,对外部变量并不感兴趣。在没有指定 dllimport 的情况下编译上述示例我在您的问题中收到了相同的未定义引用。因此,我总是使用它的原因。也可以想象,您端的问题可能是“C”链接问题。我也想看看。 非常感谢,情况是我在客户端标头中省略了 __declspec(dllimport)。在调试我的代码时,我不愿意尝试插入 __declspec(dllimport) 语句,因为我的大学老师坚持认为该语句是可选的,只是为了使链接器更容易工作。因此,从那一刻起,我将仔细检查老师的陈述。是否有任何 dll 标准,所以实际上我在哪里可以找到 __declspec(dllimport) 是强制性的信息,你是怎么想出来的??? 我能给出的关于你应该如何应该做的最好的例子是遵循微软的样板示例代码,这就是我在生成上述示例时所做的一切。函数 变量都包含导入/导出是正确的。

以上是关于如何从 DLL 中导出数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Blender 导出脚本中导出每个顶点的 UV 坐标

如何从 dll 中导出没有名称的函数

我们可以从 dll 中导入和导出函数吗

从 DLL 导出类

如何显示 DLL 可导出的函数

在 DLL 中导出的 C++ 函数中使用 #ifdef 块