不能接可变C++DLL从C程序
-
09-06-2019 - |
题
我被困在了一个修复传统的视觉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.