C++ 在visual c+中获取链接错误+;项目
我的工作空间中有一个C++ 在visual c+中获取链接错误+;项目,c++,visual-c++,dll,msvcr90.dll,.lib,C++,Visual C++,Dll,Msvcr90.dll,.lib,我的工作空间中有一个visualc++项目,它完全依赖于.lib(静态库)。现在我想用VisualC++中的现有代码创建 DLL< /Cord>项目,但是它显示了我遵循的代码>链接< /代码>错误: Linking... msvcrt.lib(MSVCRT.dll) : error LNK2005: "public: virtual __thiscall exception::~exception(void)" (??1exception@@UAE@XZ) already defined in
visualc++
项目,它完全依赖于.lib
(静态库)。现在我想用VisualC++中的现有代码创建<代码> DLL< /Cord>项目,但是它显示了我遵循的代码>链接< /代码>错误:
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.
我是这方面的新手visualc++
。我该如何处理
- 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运行时的不同选项编译的对象。
IDT\u DUKPT.lib
是静态库(对象文件的集合,而不是单独DLL的导入库)吗?如果是,我猜其中一个是使用/MTd
编译的,而另一个是使用/MD
选项编译的
有关详细信息,请参阅
有几种方法可以解决这个问题。最简单的方法可能是将应用程序的编译器标志更改为使用它尚未使用的/MDd
或/MTd
中的任何一个:
/MTd
或/MDd
/MT
或/MD
添加到其编译器选项中您是否尝试过创建新的DLL,然后在层次结构中添加每个文件,在每次添加后编译
请记住,当您添加DLL时,导出将出现在图片中。您将无法像那样直接添加。是的,您是对的。lib文件是一个静态库。您能告诉我如何更改编译器吗?@AmitPal我已经更新了我的答案,并做了相关说明。我不是VisualStudioIDE的大用户,所以可能有其他更简单的方法来实现同样的目标result@simoc实际上我在微软Visual C++中,你在谈论VisualStudio2010@AmitPal我没有任何其他版本的msvc提供说明。如果您在“项目属性”菜单选项中搜索,您应该会在“编译器标志”、“cflags”或“命令行”下找到一个类似的选项,可能这些选项的用途正好相反。你能试着在你的应用程序中使用/MD选项(调试,单线程)吗?是的,我这样做了,但它显示了错误,当我搜索它们时,它告诉我我已经创建了一个动态库,现在我正在添加一个静态库。不一定在linker->Input->“忽略特定的默认库”下提及LIBCMTD.lib@Naresh引入第二个C运行时可能会增加链接器错误的数量-每个标准C调用最终都会生成一个重复的符号错误