【发布时间】:2015-12-10 16:55:06
【问题描述】:
给定两个 C++ 项目:
- 在 Visual Studio 2015 下编译为 x86 DLL 的 Win32 C++ 项目
- 一个使用
Desktop Qt 5.5.1 MinGW 32 bitKit 的Qt GUI应用程序。
我想要做的是将第一个链接到第二个。接下来是 MWE。
DLL 头文件:libxspectra.h
namespace XSpectra
{
#define LIBXSPECTRA_EXPORTS // already defined into Project Properties
#ifdef LIBXSPECTRA_EXPORTS
#define LIBXSPECTRA_API __declspec(dllexport)
#else
#define LIBXSPECTRA_API __declspec(dllimport)
#endif
LIBXSPECTRA_API int fnlibxspectra(void);
LIBXSPECTRA_API int gnara(void) { return 7; };
int foo() { return 1; };
int bar();
}
DLL 源文件:libxspectra.cpp
#include "libxspectra.h"
namespace XSpectra
{
LIBXSPECTRA_API int fnlibxspectra(void)
{
return 42;
}
int bar()
{
return 6;
}
}
Qt 源文件:main.cpp
#include "libxspectra.h"
int main(int argc, char *argv[])
{
XSpectra::foo();
XSpectra::bar();
XSpectra::gnara();
XSpectra::fnlibxspectra();
return 0;
}
Qt 应用程序构建日志
错误:未定义对 XSpectra::bar() 的引用
错误:未定义对 _imp___ZN8XSpectra13fnlibxspectraEv 的引用
虽然foo() 和gnara() 链接正确。
一些注意事项
- 我知道这个问题并不是严格意义上的 Qt 相关的,而是不同编译工具链的问题,我是一个真正的新手。我实际上是在寻求这种方式的建议。
- 如果我评论
#define LIBXSPECTRA_EXPORTS,Visual Studio 的 Intellisense 仍将其标记为已定义,dll 编译,但外部应用程序的构建过程的行为发生了变化。出现以下错误:
错误:函数 'int XSpectra::gnara()' 定义标记为 dllimport
【问题讨论】:
-
我认为这是不可能的——我知道的唯一可以做到这一点的工具链是 clang / llvm。 MinGW 与 MSVC 的 ABI 不兼容。
-
请显示-Qt pro文件的一部分。
-
我们不关心 Qt,因为问题与使用 MinGW 工具链构建的通用 C++ 项目有关。顺便说一句,我将编辑标题以突出这一事实。
-
查看 C++ 上下文中“名称修改”和“ABI”的含义。简而言之,不同编译器的混合输出通常是不可能的。
foo()和gnara()的区别在于它们是在头文件中定义的(尽管没有正确地内联)。LIBSPECTRA_API宏的定义是正确的,但它必须用于所有要导出的符号,如fnlibxspectra()。
标签: c++ visual-studio dll mingw