2012-12-19 31 views
1

我在我的工作空間中有一個visual c++項目,完全取決於.lib(靜態庫)。現在我想創建一個使用在Visual C現有的代碼dll項目+ +,但它顯示我以下linking錯誤:在Visual c + +項目中獲取鏈接錯誤

Linking... 
msvcrt.lib(MSVCRT.dll) : error LNK2005: "public: virtual __thiscall exception::~exception(void)" ([email protected]@[email protected]) already defined in LIBCMTD.lib(stdexcpt.obj) 
msvcrt.lib(MSVCRT.dll) : error LNK2005: "public: __thiscall exception::exception(char const * const &)" ([email protected]@[email protected]@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,這樣我就可以使用我的java代碼中的方法使用JNA

`

回答

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其編譯器選項
+0

是的你是對的.lib文件是一個靜態庫。你能告訴我如何改變編譯器嗎? –

+0

@AmitPal我已經更新了我的答案和關於此的筆記。我不是Visual Studio IDE的大用戶,因此可能有其他更簡單的路線來實現相同的結果 – simonc

+0

@simoc:其實我是在Microsoft Visual C++,而你在談論Visual Studio 2010 –

0

您是否嘗試過創建新的DLL,然後在每次添加之後添加層次結構中的每個文件進行編譯?

請記住,當您添加一個DLL時,導出會進入畫面。你將無法像這樣直接添加。

+0

是的,我這樣做,但它顯示我的錯誤,當我搜索他們告訴我,我已經創建了一個動態,現在我添加一個靜態庫。不知道 –

+0

嘗試提到LIBCMTD.lib下鏈接器 - > Inp u>'忽略特定的默認庫' – Naresh

+0

@Naresh引入第二個C運行時可能會增加鏈接器錯誤的數量 - 每個標準C調用最終都會生成重複的符號錯誤 – simonc