Получение ошибки компоновки в проекте 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,

`

1

Решение

Похоже, вы смешиваете объекты, которые были скомпилированы с различными параметрами для времени выполнения Си. Является IDT_DUKPT.lib статическая библиотека (коллекция объектных файлов, а не библиотека импорта для отдельной DLL)? Если это так, я думаю, что один был скомпилирован с использованием /MTd в то время как другой использует /MD вариант.

Увидеть http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx для деталей.

Есть несколько способов исправить это. Возможно, проще всего изменить флаги компилятора для вашего приложения, чтобы оно использовало /MDd или же /MTd он уже не использовал:

  1. Щелкните правой кнопкой мыши по соответствующему csproj в Solution Explorer и выберите Properties.
  2. В появившемся диалоговом окне разверните C / C ++ и выберите «Командная строка».
  3. В окне параметров в правой части диалогового окна добавьте /MTd или же /MDd
  4. Для полноты измените конфигурацию на Release и добавьте /MT или же /MD к его опциям компилятора
2

Другие решения

Вы пытались создать новую DLL, а затем добавить каждый файл в иерархии, после каждого добавления, скомпилировать?

Помните, что когда вы добавляете DLL-файл, экспорт становится очевидным. Вы не сможете напрямую так добавить.

0