Библиотека динамических ссылок не создает файл .lib при компиляции (Visual Studio C ++ Express) - PullRequest
33 голосов
/ 16 февраля 2011

Как часть изучения C ++, я написал простую библиотеку классов + приложение, которое ссылается на нее.Все сборки, за исключением того, что библиотека классов не создает файл .lib, в результате чего приложение выдает «LINK: фатальная ошибка LNK1104: не удается открыть файл».Это кажется очень разумным;очевидно, если нет необходимого файла, возникает ошибка, и это фатально.(Примечание: у меня еще нет книги)

Итак, я начал искать причины, по которым файл .lib не может быть сгенерирован.Кстати, моя поисковая фу довольно слабая.Все, что я нашел, было то, что, если бы в библиотеке не было тегов __declspec (dllexport), она не экспортировала бы .lib.

Теперь я опубликую содержимое заголовка и .cpp библиотеки классовпростой «Console» класс с одним методом «Write (std :: string)»).

Заголовок:

// Extensions.h

#pragma once

#include "stdafx.h"

namespace Extensions {

    __declspec(dllexport) class Console
    {
    public:
        __declspec(dllexport) static void Write(std::string text);
    };
}

Я не уверен, нужно ли мне отмечать функцию, когда япометил класс, но я могу проверить, когда он работает.

И файл .cpp:

// This is the main DLL file.

#include "stdafx.h"

// #include "Console.h"

namespace Extensions {

    void Console::Write(std::string text)
    {
        std::cout << text.c_str();
    }
}

Я проверил, и он настроен на создание библиотеки динамических ссылок.

Спасибо.

1 Ответ

25 голосов
/ 16 февраля 2011

Вот пример кода, который демонстрирует, как правильно экспортировать класс. Обратите внимание на макрос CONSOLETEST_EXPORT. Это недостающая часть вашего решения. Вам нужно определить этот макрос в вашем проекте DLL и оставить его неопределенным в проектах, которые ссылаются на эту DLL.

// MAIN.CPP - TestApplication

#include <iostream>
#include "ConsoleTest.h"

int main(int argc, char** argv)
{
    std::cout << "Hello World" << std::endl;

    ConsoleTest test;

    test.Write();
    ConsoleTest::StaticWrite();

    system("pause");
}


// ConsoleTest.h - TestDll 

#include <iostream>

#ifdef CONSOLETEST_EXPORT
    #define CONSOLETEST_API __declspec(dllexport)
#else
    #define CONSOLETEST_API __declspec(dllimport)
#endif

class CONSOLETEST_API ConsoleTest
{
public:
    ConsoleTest();
    ~ConsoleTest();
    void Write();
    static void StaticWrite();
};


// ConsoleTest.cpp - TestDll

#include "ConsoleTest.h"

ConsoleTest::ConsoleTest()
{
}

ConsoleTest::~ConsoleTest()
{
}

void ConsoleTest::Write()
{
    std::cout << "Instance Write" << std::endl;
}

void ConsoleTest::StaticWrite()
{
    std::cout << "Static Write" << std::endl;
}

Проверьте эту статью на codeproject для более подробной информации. HowTo: экспорт классов C ++ из DLL

...