2012-02-14 10 views
2

error LNK2019: unresolved external symbol "char * __cdecl BytesToString(unsigned char const *,unsigned int)" ([email protected]@[email protected]) referenced in function _wmain C:\Users\anandada\Documents\Visual Studio 2010\Projects\ByteToString\ByteToString\ByteToString.obj ByteToStringビジュアルcのLNK2010エラー、他のプロジェクトファイルのメソッドを呼び出せません。

上記のエラーが発生しています。コードを以下に示します。 ByteToStringはコンソールWin32アプリケーションであり、ユーティリティはWin32 DLLです。

Utility.c

#include "stdafx.h" 
#include "Utility.h" 
#include "stdlib.h" 

char* BytesToString(const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes) 
{ 
    unsigned char bRetVal = 0; 
    unsigned int ctr = 0; 
    char* PpszString = NULL; 
    int len=0; 

    do 
    { 
     PpszString=(char*)calloc(PuiNoOfBytes*3+1,sizeof(char)); 
     if(NULL==PpszString) 
      break; 
     len=5; 
    } while(0); 
    return PpszString; 
} 

Utility.h

#ifndef _UTILITY_H 
#define _UTILITY_H 
__declspec(dllexport) char* BytesToString(const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes); 
#endif 

ByteToString.cpp

// ByteToString.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include "string.h" 
#include "stdlib.h" 
#include "..\Utility\Utility.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    unsigned char pbArray[5]={0x41,0x42,0x43,0x44,0x45}; 
    char* pbExpArray=NULL; 
    unsigned int Flag=1; 
    int len=0; 

    pbExpArray=BytesToString(pbArray,5); 
    free(pbExpArray); 
    Flag=strcmp("41 42 43 44 45 ",pbExpArray); 
    len=strlen(pbExpArray); 

    return 0; 
} 

私はこのようなプロジェクトのプロパティを設定しています

両方ByteToStringとユーティリティプロジェクトの呼び出し規則は次のとおりです。__cdecl

ByteToString、リンカー - >一般 - >追加ディレクトリで

:$(OUTDIR)

(私はこのあまりにリンカー - >一般 - >追加のディレクトリみました:$(SolutionDir)$(構成)\)

ByteToString、リンカー - >入力 - >追加Dependeniciesで:

:Utility.lib

私はこれを試してみましたaslo、

#ifndef _UTILITY_H 
#define _UTILITY_H 
extern "C" 
{ 
__declspec(dllexport) char* BytesToString(const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes); 
} 
#endif 

これはエラーになります

更新:

  1. プロジェクトを作成している間、私はUtility.cppを追加しました。 Utility.cに名前を変更し、プロジェクトのプロパティを設定してコンパイルしました。私は上記のエラーを受け取りました。
  2. その後、Utility.cppに名前を変更してコンパイルしました。エラーはありません。

なぜですか?私はユーティリティファイルは.cにしたいです。 .cファイルをプロジェクトに追加する正しい方法は何ですか?

+1

2番目のプロジェクトにファイルを含めるときに__declspec(dllimport)を使用してみましたか? –

+0

私は__declspec(dllimport) 'char * BytesToString(const unsigned char * PpcbBytes、const unsigned int PuiNoOfBytes);を使用しました。メインの前にうまく行かなかった。 – SHRI

答えて

1

エクスポートするDLLと消費する他のモジュール(DLLまたはEXE)の使用を区別するために、ヘッダーファイルが必要です。プロジェクトウィザードは、この目的のためにプリプロセッサ定義を生成していました。エクスポートDLLがUtility.dllと呼ばれる場合、この定義よりもUTILITY_EXPORTSです。あなたのプロジェクトプロパティをチェックしてください。

あなたのヘッダファイルでは、あなたがこの

#ifdef UTILITY_EXPORTS 
#define UTILITY_API __declspec(dllexport) 
#else 
#define UTILITY_API __declspec(dllimport) 
#endif 

#ifdef __cplusplus 
extern "C" { 
#endif 

UTILITY_API char* BytesToString(const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes); 

#ifdef __cplusplus 
} 
#endif 

のようなものを定義これは、あなたが消費するモジュールに追加したことを、消費するプロジェクトがインポートライブラリ内のシンボルを使用するようになります。

+0

はい、小さな修正で問題は解決しました。ありがとうございます。 :-) – SHRI

+0

UTILITY_API char * BytesToString(const unsigned char * PpcbBytes、const unsigned int PuiNoOfBytes); – SHRI

+0

WHY 'extern "C" {'は#ifdef __cplusplusと#endifの内部にあるはずですか?最後の括弧も(})です。 – SHRI

2

代わりにextern "C"で外部を宣言してください。

+0

私は試しました。 「エラーC2059:構文エラー: 'string' – SHRI

+0

コード内の「string」への参照がありません。 – Tobias

+0

「string」と呼ばれる変数は宣言されていません。 – SHRI

0

他のプロジェクトの.libファイルをプロジェクトに追加していないと思います。だからこそ、リンカーは機能を見つけることができないと言います。ハードディスク上に別のプロジェクトが横たわっているという事実は、リンカーがあなたの機能をどこに見つけるのかを知っているわけではありません。それは現在のプロジェクトでコンパイルされたコードだけを調べます。 DLLを持っている場合、LoadLibraryとGetProcAddressで関数をロードするか、付随する.libファイルをプロジェクトに追加します。

+0

私はすでに追加しました。このようなlib。リンカー - >入力 - >追加のDependenicies:Utility.lib – SHRI

+0

依存関係ウォーカーでlibファイル(またはlibをオープンできない場合はdll)を開き、関数のエクスポート方法を確認できますか?エクスポートされた名前のすべてが、リンカーが検索する名前と同じものかどうかを確認します。 – sashoalm

0

機能を実現しながら、__declspec(dllexport)を追加するあなたの必要性:

__declspec(dllexport) 
char* BytesToString(const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes) 
{ } 

を、あなたのターゲットプロジェクトに正しいLIBを持っていることを確認してください!

関連する問題