1

私のワークスペースには、 (静的ライブラリ)visual c++に完全に依存するプロジェクトがあります。Visual C++ で既存のコードを使用し.libてプロジェクトを作成したいのですが、次のエラーが表示されます。dlllinking

Linking...
 msvcrt.lib(MSVCRT.dll) : error LNK2005: "public: virtual __thiscall exception::~exception(void)" (??1exception@@UAE@XZ) already defined in LIBCMTD.lib(stdexcpt.obj)
 msvcrt.lib(MSVCRT.dll) : error LNK2005: "public: __thiscall exception::exception(char const * const &)" (??0exception@@QAE@ABQBD@Z) already defined in LIBCMTD.lib(stdexcpt.obj)
 msvcrt.lib(MSVCRT.dll) : error LNK2005: _free already defined in LIBCMTD.lib(dbgheap.obj)
 msvcrt.lib(MSVCRT.dll) : error LNK2005: _malloc already defined in LIBCMTD.lib(dbgheap.obj)
 LINK : warning LNK4098: defaultlib "msvcrt.lib" conflicts with use of other libs; use   /NODEFAULTLIB:library
 Debug/finaliTest.dll : fatal error LNK1169: one or more multiply defined symbols found
 Error executing link.exe.

私はこれで初心者ですvisual C++。どのように手続きすればよいですか?

  • のコードDllMain:

    #include "stdafx.h"
    #include "IDT_DUKPT.h"
    unsigned char stringKSN[10];
    unsigned char m_nderivation_key[16];
    unsigned char m_ninitial_key[16];
    
     BOOL APIENTRY DllMain( HANDLE hModule, 
                    DWORD  ul_reason_for_call, 
                    LPVOID lpReserved
                 )
    {   
       return TRUE;
    }  
    
     void OnDecryption(){
    
       GetKey(stringKSN, m_nderivation_key, m_ninitial_key);   
       // Initialization of the method are written in `.lib` file.
    
       }
    

どこにIDT_DUKPT.Hある:

//IDT_DUKPT.h
#define _IDT_DUKPT_H_


// TDES Encryption
void TDES_Encryption(BYTE *Data, BYTE *Key, BYTE *InitalVector, int Length);

// TDES Decryption
void TDES(BYTE *Data, BYTE *Key, BYTE *InitalVector, int Length);

// Get the Initial Key
void GetKey(BYTE *KSN, BYTE *BDK, BYTE *InitialKey);

また、プロジェクト フォルダーに配置し、プロジェクト設定へのリンクをIDT_DUKPT.lib追加します。.lib

私の主な目的は、を作成することです。これにより、を使用してコードdllのメソッドを使用できます。javaJNA

`

4

2 に答える 2

2

Cランタイムのさまざまなオプションでコンパイルされたオブジェクトを混合しているようです。IDT_DUKPT.lib静的ライブラリ(別のDLLのインポートライブラリではなく、オブジェクトファイルのコレクション)ですか?もしそうなら、私は、もう一方がオプション/MTdを使用している間に、一方がを使用してコンパイルされたと思い/MDます。

詳細については、 http://msdn.microsoft.com/en-us/library/abx4dbyh (v = vs.80).aspxを参照してください。

これを修正する方法はいくつかあります。最も簡単なのは、アプリのコンパイラフラグを変更して、次のいずれかを使用するか、/MDdまだ/MTd使用していないことです。

  1. ソリューションエクスプローラーで関連するcsprojを右クリックし、[プロパティ]を選択します
  2. 表示されるダイアログで、[C / C ++]を展開し、[コマンドライン]を選択します
  3. ダイアログの右側にあるオプションボックスで、/MTdまたはを追加します/MDd
  4. 完全を期すために、構成を「リリースして追加」/MTまたは/MDそのコンパイラー・オプションに変更してください。
于 2012-12-19T11:30:01.450 に答える
0

新しい DLL を作成してから、各ファイルを階層に追加し、追加するたびにコンパイルしてみましたか?

DLL を追加するときは、エクスポートが明らかになることに注意してください。そのように直接追加することはできません。

于 2012-12-19T11:30:20.910 に答える