【问题标题】:Getting linking error in visual c++ project在 Visual C++ 项目中出现链接错误
【发布时间】:2012-12-19 11:22:29
【问题描述】:

我的工作空间中有一个visual c++ 项目,它完全依赖于.lib(静态库)。现在我想使用 Visual c++ 中的现有代码创建一个dll 项目,但它显示我遵循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,这样我就可以使用JNA 中的java 代码中的方法。

`

【问题讨论】:

    标签: c++ visual-c++ dll msvcr90.dll .lib


    【解决方案1】:

    听起来您正在混合使用 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. 为了完整起见,请将配置更改为 Release 并将 /MT/MD 添加到其编译器选项中

    【讨论】:

    • 是的,你是对的 .lib 文件是一个静态库。请告诉我如何更改编译器?
    • @AmitPal 我已经用关于此的注释更新了我的答案。我不是 Visual Studio IDE 的大用户,所以可能有其他更简单的路线来实现相同的结果
    • @simoc :实际上我在使用 Microsoft Visual C++,而您正在谈论 Visual Studio 2010
    • @AmitPal 我没有任何其他版本的 msvc 可用于提供说明。如果您浏览项目属性菜单选项,您应该在“编译器标志”、“cflags”或“命令行”之类的内容下找到类似的选项
    • 也许这些选项被反过来使用了。您可以尝试在您的应用程序中更改为使用 /MD 选项(调试,单线程)吗?
    【解决方案2】:

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

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

    【讨论】:

    • 是的,我这样做了,但它向我显示了错误,当我搜索它们时,它告诉我已经创建了一个动态库,现在我正在添加一个静态库。不确定
    • 尝试在链接器->输入->“忽略特定默认库”下提及 LIBCMTD.lib
    • @Naresh 引入第二个 C 运行时可能会增加链接器错误的数量 - 每个标准 C 调用最终都会产生重复符号错误
    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多