tutorial - La biblioteca de vínculos dinámicos no genera un archivo.lib cuando se compila(Visual Studio C++ Express)
microsoft dll (1)
Como parte del aprendizaje de C ++, escribí una biblioteca de clases simple + aplicación que hace referencia a ella. Todo se compila, excepto que la biblioteca de clases no genera un archivo .lib, lo que da como resultado que la aplicación arroje un "ENLACE: error fatal LNK1104: no se puede abrir el archivo". Esto parece muy razonable; obviamente, si un archivo necesario no está allí, hay un error y es fatal. (Nota al margen: todavía no tengo un libro)
Entonces, fui buscando razones por las que un archivo .lib podría no ser generado. Mi búsqueda-fu, por cierto, es bastante débil. Todo lo que encontré fue que, si la biblioteca no tenía ninguna etiqueta __declspec (dllexport), no exportaría una .lib.
Ahora publicaré los contenidos de encabezado y .cpp de la biblioteca de clase (una clase simple de "Consola" con un método de "escritura (std :: cadena)").
Encabezamiento:
// Extensions.h
#pragma once
#include "stdafx.h"
namespace Extensions {
__declspec(dllexport) class Console
{
public:
__declspec(dllexport) static void Write(std::string text);
};
}
No estoy seguro si necesito etiquetar la función cuando etiqueté la clase, pero puedo verificarlo cuando funciona.
Y el archivo .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();
}
}
Lo he comprobado y está configurado para generar una biblioteca de enlaces dinámicos.
Gracias.
Aquí hay un código de muestra que demuestra cómo exportar correctamente una clase. Preste atención a la macro CONSOLETEST_EXPORT. Esta es la parte que falta de tu solución. Debe definir esta macro en su proyecto DLL y dejarla indefinida en los proyectos que hacen referencia a esta 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;
}
Echa un vistazo a este artículo en codeproject para más detalles. HowTo: Exportar clases de C ++ desde una DLL