我遇到此代码的问题,从现有的.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);
}
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_ */
我已将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
命令行
只返回
但我仍然在配置属性/链接器/输入中的配置属性/“C / C ++”/常规和附加依赖项(Cryptolib.lib
)中添加了C / C ++附加包含目录
答案 0 :(得分:5)
#pragma once
#pragma comment (lib, "CryptoLib.lib")
#include "stdafx.h"
这是错误的。编译器将继续查找stdafx.h #include指令,忽略之前找到的任何内容。所以它会完全忽略你的#pragma comment指令。因此,链接器将不链接CryptoLib.lib,您确实会收到此链接器错误。在.cpp文件中使用#pragma一次没有意义。
另一个问题是,您似乎使用/ clr编译此代码,我们可以使用使用语句来判断。编译器无法判断您的函数是__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"
的使用,它会禁用名称修饰。如果您不能或不应该编辑此头文件,那么您可以在#include周围的.cpp文件中填写extern“C”{}。
如果仍有问题,请发布完全链接器错误消息,以及从Visual Studio命令提示符运行DLL上Dumpbin.exe /exports
时看到的内容。