3

このコードに問題があり、既存の .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 /エクスポート

しかし、構成プロパティ/「C/C++」/一般にC/C++追加インクルードディレクトリを追加し、構成プロパティCryptolib.lib/リンカー/入力に追加の依存関係()を追加しました

4

1 に答える 1

5
#pragma once
#pragma comment (lib, "CryptoLib.lib")
#include "stdafx.h"

これは間違っています。コンパイラは stdafx.h #include ディレクティブを探しに行き、それより前に見つかったものはすべて無視します。したがって、#pragma コメント ディレクティブは完全に無視されます。したがって、リンカーはCryptoLib.lib をリンクせず、実際にこのリンカー エラーが発生します。.cpp ファイルで #pragma once を使用しても意味がありません。

もう 1 つの問題は、/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 を囲む extern "C" {} を詰め込むことができます。

それでも問題が解決しない場合は、正確なDumpbin.exe /exportsリンカ エラー メッセージと、Visual Studio コマンド プロンプトから DLLを実行したときに表示される内容を投稿してください。

于 2013-07-31T13:50:04.897 に答える