Динамическая библиотека ссылок не сгенерирует .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();
}
}
Я проверил, и он настроен на создание динамической библиотеки ссылок.
Спасибо.
Ответы
Ответ 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