Подтвердить что ты не робот

Динамическая библиотека ссылок не сгенерирует .lib файл при компиляции (Visual Studio С++ Express)

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

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

Теперь я опубликую содержимое заголовка и .cpp библиотеки классов (простой класс "Консоль" с одним методом "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();
    }
}

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

Спасибо.

4b9b3361

Ответ 1

Вот пример кода, который демонстрирует, как правильно экспортировать класс. Обратите внимание на макрос CONSOLETEST_EXPORT. Это недостающая часть вашего решения. Вы должны определить этот макрос в своем проекте DLL и оставить его undefined в проектах, ссылающихся на эту 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: Экспорт классов С++ из DLL