【问题标题】:Link a MSVC compiled DLL in a MinGW-built project在 MinGW 构建的项目中链接 MSVC 编译的 DLL
【发布时间】:2015-12-10 16:55:06
【问题描述】:

给定两个 C++ 项目:

  1. Visual Studio 2015
  2. 下编译为 x86 DLLWin32 C++ 项目
  3. 一个使用Desktop Qt 5.5.1 MinGW 32 bit Kit 的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() 链接正确。

一些注意事项

  1. 我知道这个问题并不是严格意义上的 Qt 相关的,而是不同编译工具链的问题,我是一个真正的新手。我实际上是在寻求这种方式的建议。
  2. 如果我评论 #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


【解决方案1】:

您只能将 MSVC 编译的 C DLL 与 MinGW 链接,并且只能在 32 位 Windows 上。 MinGW 链接器可以直接链接到 DLL(如果函数被正确导出并且不仅可以通过导入库获得)或通常的导入库。请参阅herehere,了解如何从 DLL 生成 MinGW 导入库。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 2011-01-29
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多