Ошибка LNK1104, связывающая .dll с тестовым приложением в Visual Studio, недействительный или поврежденный файл

Я пытаюсь создать простую DLL HelloWorld на С++, чтобы впервые освоить использование библиотек DLL С++. Но когда я пытаюсь собрать свой проект, содержащий мой метод, я всегда получаю сообщение об ошибке error LNK1107: invalid or corrupt file: cannot read at 0x2B8 C:\Users\octavio\Documents\Visual Studio 2013\Projects\UseOfDll\UseOfDll\HelloWorldDll.dll.

В моем проекте UseOfDll я добавил C:\Users\octavio\Documents\Visual Studio 2013\Projects\UseOfDll\UseOfDll\HelloWorldDll.dll к Project > UseOfDll Properties > Linker > Input > Additional Dependecies. Я также добавил HelloWorldDll.dll и HelloDll.h в каталог проекта UseOfDll.

Это основной метод программы (называемой UseOfDll), который использует DLL:

// UseOfDll.cpp ----------------------------------------------------

#include "stdafx.h"
#include "HelloDll.h"

int _tmain(int argc, _TCHAR* argv[]) {
    HelloDll helloDll;
    helloDll.hello();
    HelloDll::helloStatic();
    getchar();
    return 0;
}

В моем отдельном проекте Visual Studio для DLL у меня есть:

// HelloDll.h ------------------------------------------------------

#pragma once

#ifdef DLLDIR_EX
    #define DLLDIR  __declspec(dllexport)   // export DLL information
#else
    #define DLLDIR  __declspec(dllimport)   // import DLL information
#endif 

class HelloDll {
    public:
        HelloDll();
        ~HelloDll();
        void hello();
        static void helloStatic();
};

// HelloDll.cpp ----------------------------------------------------

#include "stdafx.h"
#include "HelloDll.h"
#include <iostream>
using namespace std;

HelloDll::HelloDll() {}


HelloDll::~HelloDll() {}

void HelloDll::hello() {
    cout << "Hello World of DLL" << endl;
}

void HelloDll::helloStatic() {
    cout << "Hello World of DLL static" << endl;
}

person roscioli    schedule 22.05.2014    source источник
comment
Это стандартная ошибка, вы не можете связать DLL. У него недостаточно информации, чтобы позволить компоновщику выполнить правильную работу. Компоновщик просто падает, когда не может понять содержимое файла. Вместо этого вы должны связать библиотеку импорта DLL.   -  person Hans Passant    schedule 22.05.2014
comment
Ваш класс не экспортируется, поместите __declspec(dllexport) в определение вашего класса   -  person Matt    schedule 22.05.2014
comment
@Matt Разве у меня уже нет этого в строке после #ifdef DLLDIR_EX?   -  person roscioli    schedule 22.05.2014
comment
@roscioli, нет, это просто определение макроса.   -  person Matt    schedule 22.05.2014
comment
@HansPassant Является ли библиотека импорта файлом .lib? И должен ли я добавить файл .lib в Linker › Input › Additional Dependencies, только не файл .dll)? Наконец, когда я компилирую свой проект DLL, я не получаю файл .lib. Я что-то неправильно настраиваю?   -  person roscioli    schedule 22.05.2014
comment
Вы не получите файл .lib, потому что ничего не экспортировали.   -  person Hans Passant    schedule 22.05.2014
comment
@Matt Какой файл класса мне поместить __declspec(dllexport) и куда?   -  person roscioli    schedule 22.05.2014


Ответы (1)


Решение: замените class HelloDll на class DLLDIR HelloDll. Это связывает класс с библиотекой экспорта DLL.

person roscioli    schedule 23.05.2014