3

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

我的代码.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,但我仍然得到“未解析的令牌 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命令行只 返回垃圾箱.exe /exports

但是我仍然在 Configuration Properties/"C/C++"/General 中添加了 C/C++ Additional Include 目录,Cryptolib.lib在 Configuation Properties/Linker/Input 中添加了 Additional Dependencies ( )

4

1 回答 1

5
#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",它会禁用名称修饰。如果您不能或不应该编辑此头文件,那么您可以将 extern "C" {} 塞进 .cpp 文件中,围绕 #include。

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

于 2013-07-31T13:50:04.897 回答