Получение ошибки компоновки в проекте Visual C++
У меня есть 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
,
`
2 ответа
Похоже, вы смешиваете объекты, которые были скомпилированы с различными параметрами для времени выполнения Си. Является IDT_DUKPT.lib
статическая библиотека (коллекция объектных файлов, а не библиотека импорта для отдельной DLL)? Если это так, я думаю, что один был скомпилирован с использованием /MTd
в то время как другой использует /MD
вариант.
См. http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx для получения подробной информации.
Есть несколько способов исправить это. Возможно, проще всего изменить флаги компилятора для вашего приложения, чтобы оно использовало /MDd
или же /MTd
он уже не использовал:
- Щелкните правой кнопкой мыши по соответствующему csproj в обозревателе решений и выберите Свойства
- В появившемся диалоговом окне разверните C/C++ и выберите "Командная строка".
- В окне параметров в правой части диалогового окна добавьте
/MTd
или же/MDd
- Для полноты измените конфигурацию на Release и добавьте
/MT
или же/MD
к его опциям компилятора
Вы пытались создать новую DLL, а затем добавить каждый файл в иерархию, после каждого добавления, скомпилировать?
Помните, что когда вы добавляете DLL, экспорт становится понятным. Вы не сможете напрямую так добавить.