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

C++ C++\CLI LNK错误2019&;2028,包含.h和.lib(链接器查找这些文件)[包装器],c++,c++-cli,wrapper,linker-errors,C++,C++ Cli,Wrapper,Linker Errors,我对这段代码有一个问题,从现有的.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(d

我对这段代码有一个问题,从现有的.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,但是我仍然得到了 “未解析的令牌加密库\加密” 和 “未解析的外部符号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
comand行 正好

但是我仍然在Configuration Properties/“C/C++”General中添加了C/C++附加Include目录,并在Configuration Properties/Linker/Input中添加了附加依赖项(
Cryptolib.lib

#pragma once
#pragma comment (lib, "CryptoLib.lib")
#include "stdafx.h"
这是错误的。编译器将查找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)

还有另一个可能的问题,函数声明是不清楚的,是用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”
的用法,它禁用名称修饰。如果不能或不应该编辑此头文件,则可以在.cpp文件中,围绕#include填充外部“C”{}


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

include“stdafx.h”指令必须是代码中的第一行。请注意您为此收到的警告。它似乎只需要是第一行,includeI更改了Wrapper.cpp的第一行,我仍然会收到相同的错误。我认为LIB是用C++代码编写的,因为我自己没有创建标头。谢谢你的名字,得到了C++装饰,注意@ @ $ $FYAXPAE0@Z以我的名义。我特别警告过这一点。您确实需要运行dumpbin.exe,以便了解这些符号的真实外观。请避免使用快捷方式。我没有DLL,我应该根据库创建一个。这可能吗?如果这是一个静态链接库,而不是DLL的导入库,那么您可能会遇到更多问题,它们通常只能在使用与您使用的完全相同的编译器构建时工作。您可以使用dumpbin.exe/all来查看外部名称。但是,您很可能需要与库所有者联系并获得更新,以便它能够与您的编译器一起工作。