我对此代码有问题,从现有的.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);
}

加密库
#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_ */

我已经链接了cryptolib.h和cryptolib,但是我仍然得到
“未解析的 token 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
Dumpbin.exe /exports命令行
只返回

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

最佳答案

#pragma once
#pragma comment (lib, "CryptoLib.lib")
#include "stdafx.h"

错了编译器将继续查找stdafx.h #include指令,而会忽略在此之前找到的任何内容。因此,它将完全忽略您的#pragma注释指令。因此,链接器将不会链接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)

函数声明还有另一个可能的问题,目前尚不清楚该函数是使用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_ */

注意extern "C"的用法,它将禁用名称修饰。如果您不能或不应该编辑此头文件,则可以在#c周围的.cpp文件中填充extern“C” {}。

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

08-18 05:56