Link 一个 MSVC 编译的 DLL 在一个 MinGW 构建的项目中
Link a MSVC compiled DLL in a MinGW-built project
给定两个 C++ 项目:
- a Win32 C++ 项目编译为 x86 DLL under Visual Studio 2015
- 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 正确。
几点注意事项
- 我知道问题不是严格的Qt相关,而是不同编译工具链的问题,我是一个真正的新手领域。我其实是在这样求教
- 如果我评论
#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版本。
给定两个 C++ 项目:
- a Win32 C++ 项目编译为 x86 DLL under Visual Studio 2015
- 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 正确。
几点注意事项
- 我知道问题不是严格的Qt相关,而是不同编译工具链的问题,我是一个真正的新手领域。我其实是在这样求教
- 如果我评论
#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版本。