在QT

时间:2015-11-05 18:00:11

标签: c qt visual-studio-2013 dll linker

我在QtCreator中使用QT 5.5.0来构建一个C ++应用程序(从现在开始称为“应用程序”),我试图将其链接到动态链接C库(“库”)。在构建应用程序时,链接器无法找到源自此库的所有方法,一个方法的示例输出:

error: LNK2019: unresolved external symbol "__declspec(dllimport) int __cdecl rlwe_FFT_CTX_init(struct fft_ctx *)" (__imp_?rlwe_FFT_CTX_init@@YAHPAUfft_ctx@@@Z) referenced in function [...]

该库由.pro文件中的以下语句导入:

LIBS += "-L$$_PRO_FILE_PWD_/../../Libraries/rlwekex/Build/rlwekex/Release/Win32/" -lrlwekex

我希望这可以工作,因为qmake正常运行,如果我将其更改为不存在的库名,链接器将输出另一个错误。应用程序和库都是32位。

该库的.lib和.dll文件是我自己使用Visual Studio 2013构建的。相同的头文件用于构建库和包含在应用程序内部。编译开关将使用以下代码将方法标记为__declspec(dllexport)__declspec(dllimport)

#  ifdef RLWEKEX_DLL_EXPORT
#   define RLWEKEX_EXPORT __declspec(dllexport)
#  else
#    define RLWEKEX_EXPORT __declspec(dllimport)
#  endif

在库(导出)和应用程序(导入)中都正确评估了宏。示例方法的签名如下:

RLWEKEX_EXPORT int rlwe_FFT_CTX_init(FFT_CTX *ctx);

使用dumpbin我可以验证该方法是否实际导出到.lib - 对应的/ HEADERS条目:

  Version      : 0
  Machine      : 14C (x86)
  TimeDateStamp: 563B4D17 Thu Nov 05 13:35:35 2015
  SizeOfData   : 0000001F
  DLL name     : rlwekex.dll
  Symbol name  : _rlwe_FFT_CTX_init
  Type         : code
  Name type    : no prefix
  Hint         : 2
  Name         : rlwe_FFT_CTX_init

我有另一个Visual Studio 2013项目,这是一个针对这个特定库的测试套件(用C语言编写),它正好连接它! QtCreator和Visual Studio 2013在同一台机器上运行,并且都使用相同的编译器工具包(msvc)。

现在我的问题当然是:我可以在VS2013测试套件中链接库而不是在QT项目中的原因是什么?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

C ++会破坏函数的名称,而C则不会。

库的头文件需要在文件开头附近包含:

#ifdef __cplusplus
extern "C" {
#endif

并靠近头文件的末尾

#ifdef __cplusplus
}
#endif

注意:上面的行位于'include guard'之间,而不是替换它们

相关问题