我在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项目中的原因是什么?任何帮助将不胜感激!
答案 0 :(得分:1)
C ++会破坏函数的名称,而C则不会。
库的头文件需要在文件开头附近包含:
#ifdef __cplusplus
extern "C" {
#endif
并靠近头文件的末尾
#ifdef __cplusplus
}
#endif
注意:上面的行位于'include guard'之间,而不是替换它们