1

我的visual c++工作空间中有一个完全依赖于.lib(静态库)的项目。现在我想dll使用 Visual C++ 中的现有代码创建一个项目,但它显示以下linking错误:

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,这样我就可以使用我的java代码中的方法JNA

`

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++ 然后选择 Command Line
  3. 在对话框右侧的选项框中,添加/MTd/MDd
  4. 为了完整起见,将配置更改为 Release 并添加/MTor/MD到其编译器选项
于 2012-12-19T11:30:01.450 回答
0

您是否尝试过创建新的 DLL,然后在层次结构中添加每个文件,每次添加后,编译?

请记住,当您添加一个 DLL 时,导出就出现了。您将无法直接添加。

于 2012-12-19T11:30:20.910 回答