一般信息 [可选]:
我最近熟悉静态和动态库。
现在我正在尝试学习如何使用 DLL,我尝试模仿所有可能的使用变体,以便遇到可能的瓶颈和防止它们的方法。
我的目标
是:找出如何从用一个编译器编译的 DLL 中导出全局变量。VS 编译器(IDE Visual Studio 2010)到使用另一个编译器 MingW(IDE Qt Creator 5.0)编译的客户端。实际上,我对特定案例感兴趣,而不是常见案例,但是如果提供常见案例的信息-那就太好了。
同样重要的是 dll 到客户端的连接是隐式的(不是显式的,然后我们手动连接库)。
我也提出了这样的问题,因为我很感兴趣如何通过提供更新的 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
}
动态链接库
/* .cpp file in dll: */
#define EXPORT ""
#define VS2010 ""
char ImplicitDLLName[] = "MySUMoperator";
客户端 /* 客户端 .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
t 发现,所以我猜它是 ImplicitDLLName 仅用额外的符号修饰(名称修饰)。
我想知道这个问题可能是由于不同编译器中数组的不同实现或内存中数组的对齐方式引起的?
问题:如何解决这个二进制兼容性问题?