我被困在了一个修复传统的视觉C++6程序。在C++DLL源,我已经把

extern "C" _declspec(dllexport) char* MyNewVariable = 0;

其结果在MyNewVariable表示了(好未修饰)在出口表(如通过dumpbin/出口blah.dll).然而,我不知道如何申报的变量,这样我就可以访问它C源的文件。我已经尝试了各种各样的事情,包括

_declspec(dllimport) char* MyNewVariable;

但是,这只是给我一个接头的错误:

尚未解决的外在象征"声明影响(dllimport)char*MyNewVariable"(__imp_?MyNewVariable@@3PADA)

extern "C" _declspec(dllimport) char* MyNewVariable;

作为建议通过Tony(和如我试图前)的结果在一个不同的预计装饰,但还是没有删除:

尚未解决的外部符号__imp__MyNewVariable

我怎么写的宣言》,使用C++DLL变量可从C程序?


答案

作为确定通过botismarius和其他人(许多人感谢所有)的,我需要链接与DLL。lib。防止的名称被错我需要声明它(C源)没有装修,这意味着我需要使用。lib文件。

有帮助吗?

解决方案

你必须对lib产生的后编写的DLL。接器选项的项目,就必须添加的 .lib 文件。并且是的,还应宣布本变量为:

extern "C" { declspec(dllimport) char MyNewVariable; }

其他提示

外部"C"是你如何除去的装饰-它应该使用:

外部"C"影响(dllimport)char MyNewVariable;

或如果你想要一个标题,可以使用C++或C(与/TC交换)

#ifdef __cplusplus
extern "C" {
#endif
declspec(dllimport) char MyNewVariable;
#ifdef __cplusplus
}
#endif

当然,与导入库链接产生的dll做的出口。

我不知道谁downmodded botismarius,因为他是正确的。其原因。lib产生是进口的图书馆,使得它很容易只是宣布的外部变量/功能 __declspec(dllimport) 并且只要使用它。进图书馆只是自动化的必要 LoadLibrary()GetProcAddress() 呼叫。没有它,你需要调用这些手动。

他们都是正确的。事实错误信息介绍 __imp_?MyNewVariable@@3PADA 意味着它在寻找的装饰的名称,因此,外部的"C"是必要的。然而,与进口的图书馆是 有必要或者你只是得到一个不同的链接的错误。

@Graeme:你就在这,也是。我认为"C"编译器运算,是使用不是强制执行C99标准,但汇编C++,因此重整的名称。一个真正的C编译器不会理解的"C"的一部分 extern "C" 关键词。

dll源代码 你应该有这个执行情况,以便。lib文件 出口 符号:

extern "C" _declspec(dllexport) char* MyNewVariable = 0;

C客户应使用 这个宣言,所以,客户的代码 进口 符号:

extern "C" _declspec(dllimport) char* MyNewVariable;

这个标题将导致一个编译错误,如果#include-ed在dll源代码,因此通常放在一个出口头中,仅用于出口的功能,只有通过客户。

如果需要,还可以创造一种"通用"标题,可以包括任何地方看起来是这样的:

#ifdef __cplusplus
extern "C" {
#endif
#ifdef dll_source_file
#define EXPORTED declspec(dllexport) 
#else
#define EXPORTED declspec(dllimport) 
#endif dll_source_file
#ifdef __cplusplus
}
#endif

EXPORTED char* MyNewVariable;

然后dll源代码看起来是这样的:

#define dll_source_code 
#include "universal_header.h"

EXPORTED char* MyNewVariable = 0;

和客户看起来是这样的:

#include "universal_header.h"
...
MyNewVariable = "Hello, world";

如果你这样做很多,怪物#ifdef在顶部可以去export_magic.h和universal_header.h变为:

#include "export_magic.h"

EXPORTED char *MyNewVariable;

我从来没有使用_declspec(dllimport)当我被编程。你应该能够简单地声明

extern "C" char* MyNewVariable;

和链接。libb时创建DLL was compiled.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top