Link 一个 MSVC 编译的 DLL 在一个 MinGW 构建的项目中

Link a MSVC compiled DLL in a MinGW-built project

给定两个 C++ 项目:

  1. a Win32 C++ 项目编译为 x86 DLL under Visual Studio 2015
  2. a Qt GUI 应用程序使用 Desktop Qt 5.5.1 MinGW 32 bit 套件。

我想做的是 link 第二个中的第一个。接下来是 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 应用程序构建日志

error: undefined reference to XSpectra::bar()

error: undefined reference to _imp___ZN8XSpectra13fnlibxspectraEv

虽然 foo()gnara() link 正确。

几点注意事项

  1. 我知道问题不是严格的Qt相关,而是不同编译工具链的问题,我是一个真正的新手领域。我其实是在这样求教
  2. 如果我评论 #define LIBXSPECTRA_EXPORTS,Visual Studio 的 Intellisense 仍将其标记为已定义,dll 会编译,但外部应用程序构建过程的行为会发生变化。出现以下错误:

error: function 'int XSpectra::gnara()' definition is marked dllimport

您只能link MSVC 使用 MinGW 编译 C DLL,并且只能在 32 位上 Windows。 MinGW linker 可以 link 直接到 DLL(如果函数正确导出并且不仅可以通过导入库使用)或通常的导入库。请参阅 here and here 了解如何从 DLL 生成 MinGW 导入库。

您将像使用 MSVC 一样进行操作(使用标记为 dllexport 的函数编译 dll,并使用标记为 dllimport 的函数编译代码,或者使用 .def 文件之类的)。请记住,您需要导出 C 函数,这意味着它们需要标记为 extern "C".

虽然我强烈建议,使代码与 MinGW 兼容,然后用它编译所有内容。或者使用Qt的MSVC版本。