包含.h和.lib的C++\CLI LNK错误2019和2028(链接器找到这些文件)[包装]

069*_*699 3 c++ c++-cli linker-errors wrapper

我有这个代码的问题,从现有的.lib(CryptoLib.lib)编写包装函数:

mycode.ccp

#include "stdafx.h"
#pragma managed(push, off)
#include "CryptoLib.h"
#pragma comment (lib, "CryptoLib.lib")
#pragma managed(pop)

using namespace System;//This is a C++-CLI project.

__declspec(dllexport) void Encrypt(unsigned char *Data, unsigned char *RandomNr)
{
   CryptoLib_Encrypt(Data, RandomNr);
}
Run Code Online (Sandbox Code Playgroud)

cryptolib.h

#ifndef _CRYPTOLIB_H_
#define _CRYPTOLIB_H_

#define PUBLIC
//This procedure is written in c++ code
extern void CryptoLib_Encrypt(unsigned char *Data, unsigned char *RandomNr);

#endif /* _CRYPTOLIB_H_ */
Run Code Online (Sandbox Code Playgroud)

我已经连接了cryptolib.h和cryptolib,但我仍然得到"未解析的令牌Cryptolib_Encrypt"和"未解析的外部符号Cryptolib_Encrypt"错误.

谁能告诉我为什么?

谢谢你的帮助

确切的错误消息:

error LNK2028: unresolved token (0A000006) "void __cdecl CryptoLib_Encrypt(unsigned char *,unsigned char *)" (?CryptoLib_Encrypt@@$$FYAXPAE0@Z) referenced in function "void __cdecl Encrypt(unsigned char *,unsigned char *)" (?Encrypt@@$$FYAXPAE0@Z)
error LNK2019: unresolved external symbol "void __cdecl CryptoLib_Encrypt(unsigned char *,unsigned char *)" (?CryptoLib_Encrypt@@$$FYAXPAE0@Z) referenced in function "void __cdecl Encrypt(unsigned char *,unsigned char *)" (?Encrypt@@$$FYAXPAE0@Z)


error LNK1120: 2 unresolved externals
Run Code Online (Sandbox Code Playgroud)

Dumpbin.exe /exportsCOMAND行刚刚返回 Dumpbin.exe /导出

但我仍然在配置属性/"C/C++"/常规中添加了C/C++附加包含目录,并在配置Cryptolib.lib属性/链接器/输入中添加了附加依赖项()

Han*_*ant 5

#pragma once
#pragma comment (lib, "CryptoLib.lib")
#include "stdafx.h"
Run Code Online (Sandbox Code Playgroud)

这是错的.编译器将继续查找stdafx.h #include指令并忽略它之前找到的任何内容.所以它会完全忽略你的#pragma comment指令.因此链接器不会链接CryptoLib.lib,您确实会收到此链接器错误.在.cpp文件中使用#pragma一次没有意义.

另一个问题是你似乎用/ clr编译这段代码,我们可以从using语句中看出来.编译器无法判断您的函数是__cdecl函数,它将采用默认值,并且在启用托管代码编译时为__clrcall.你必须明确它,像这样:

#include "stdafx.h"          // First line in file!
#pragma managed(push, off)
#include "CryptoLib.h"
#pragma comment (lib, "CryptoLib.lib")
#pragma managed(pop)
Run Code Online (Sandbox Code Playgroud)

函数声明还有另一个可能的问题,不清楚该函数是用C编译器还是C++编译器编译的.C++编译器将修饰函数名称.如果它实际上是用C编译器编译的,那么你必须告诉编译器:

#ifndef _CRYPTOLIB_H_
#define _CRYPTOLIB_H_

#ifdef __cplusplus
extern "C" {
#endif

void __cdecl CryptoLib_Encrypt(unsigned char *Data, unsigned char *RandomNr);

#ifdef __cplusplus
}
#endif

#endif /* _CRYPTOLIB_H_ */
Run Code Online (Sandbox Code Playgroud)

注意用法extern "C",它禁用名称修饰.如果您不能或不应该编辑此头文件,那么您可以在#include周围的.cpp文件中填写extern"C"{}.

如果仍有问题,请发布确切的链接器错误消息,以及Dumpbin.exe /exports从Visual Studio命令提示符运行DLL 时看到的内容.

  • 这些名字得到了C++的装饰,注意名字中的@@ $$ FYAXPAE0 @ Z. 我特别警告过这一点.你真的需要运行dumpbin.exe,这样你才能知道这些符号*真正*的样子.请避免走捷径. (2认同)