常规信息[可选]:
我最近对静态& amp;动态图书馆
现在我正在尝试学习如何使用DLL,我尝试模仿所有可能的使用变体,以便遇到可能的瓶颈和方法来防止它们。
我的目标:
是找出如何从一个DLL编译的全局变量,该DLL是用一个编译器编译的。 VS编译器(IDE Visual studio 2010)到使用另一个编译器MingW(IDE Qt Creator 5.0)编译的客户端。实际上我对特定情况感兴趣,不常见,但如果提供常见情况的信息 - 会很棒。
另外重要的是dll与客户端的连接是隐式的(不是expilcit然后我们手动连接库)。
此外,我提出了这样的问题,因为我很有意思如何通过提供更新的dll来支持客户端的应用程序,因为在项目开始时用于客户端和dll的编译器版本可以是同样,但随着时间的推移它们可能会有所不同,那么如何解决这个二进制兼容性问题呢?
我试图将dll中定义的数组导出到客户端。
DLL&客户端
/* header file. Is used by both: dll and client */
#ifdef EXPORT
#define MYLIB __declspec(dllexport)
#else
#define MYLIB __declspec(dllimport)
#endif
extern "C" { // My be this directive not supported by MingW???
#ifdef VS2010
extern MYLIB char ImplicitDLLName[];
#else
Q_DECL_IMPORT extern char ImplicitDLLName[];
#endif
}
DLL
/* .cpp file in dll: */
#define EXPORT ""
#define VS2010 ""
char ImplicitDLLName[] = "MySUMoperator";
客户端 / * Client .cpp * /
void MainWindow::on_pushButtonAdd_clicked()
{
// ...
printf("%s",ImplicitDLLName);
}
尝试在客户端中使用该数组会导致链接器引发以下错误:
error: undefined reference to `_imp__ImplicitDLLName'
我知道可能由此产生的名称错误和兼容性问题,但我试图通过使用
解除它来解决它extern "C"{}
通过发现客户端s linker I can tell that I have failed to disable it, because it reports that reference on _imp__ImplicitDLLName wasn
返回的错误,所以我猜它是ImplicitDLLName,只用其他symobls(名称mangling)装饰。
我想知道这个问题可能是由于不同编译器中数组的不同实现或内存中数组的对齐而引起的
问题:如何解决这个二进制兼容性问题?