我对此代码有问题,从现有的.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
时看到的内容。