C ++ \ CLI LNK错误2019& 2028 with Included .h和.lib(Linker找到那些文件)[Wrapper]

时间:2013-07-23 06:37:11

标签: 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(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命令行 只返回 Dumpbin.exe /exports

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

1 个答案:

答案 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时看到的内容。