Грешка LNK1104, свързваща .dll към тестово приложение във Visual Studio, невалиден или повреден файл

Опитвам се да направя проста HelloWorld DLL в C++, за да науча да използвам C++ 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
comment
@roscioli msdn.microsoft.com/en-us/library/81h27t8c.aspx   -  person Matt    schedule 22.05.2014


Отговори (1)


Решение: заменете class HelloDll с class DLLDIR HelloDll. Това свързва класа с библиотеката за експортиране на DLL.

person roscioli    schedule 23.05.2014