La bibliothèque de liens dynamiques ne génère pas de fichier. lib lors de la compilation (Visual Studio C++ Express)
Dans le cadre de l'apprentissage du c++, j'ai écrit une bibliothèque de classes simple + une application qui le fait référence. Tout construit, sauf que la bibliothèque de classes ne génère pas de .fichier lib, ce qui entraîne dans l'application de lancer un "lien : erreur fatale LNK1104: impossible d'ouvrir le fichier". Cela semble très raisonnable; évidemment, si un fichier nécessaire n'est pas là, il y a une erreur et c'est fatal. (Note de côté: je n'ai pas encore de livre)
Donc, je suis allé chercher des raisons A.le fichier lib peut ne pas être généré. Mon recherche-fu, en passant, est plutôt faible. Tout ce que j'ai trouvé, c'est que, si la bibliothèque n'avait pas de balises __declspec(dllexport), elle n'exporterait pas un .lib.
Je vais maintenant poster l'en-tête et .contenu cpp de la bibliothèque de classes (une simple classe "Console" avec une méthode" Write(std::string)").
En-tête:
// Extensions.h
#pragma once
#include "stdafx.h"
namespace Extensions {
__declspec(dllexport) class Console
{
public:
__declspec(dllexport) static void Write(std::string text);
};
}
Je ne sais pas si je dois marquer la fonction quand j'ai marqué la classe, mais je peux vérifier cela quand cela fonctionne.
Et le.fichier 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();
}
}
J'ai vérifié, et il est configuré pour générer une bibliothèque de liens dynamiques.
Merci.
1 réponses
Voici un exemple de code qui montre comment exporter correctement une classe. Faites attention à la macro CONSOLETEST_EXPORT. C'est la partie manquante de votre solution. Vous devez définir cette macro dans votre projet DLL et la laisser indéfinie dans les projets qui font référence à cette 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;
}
Consultez cet article sur codeproject pour plus de détails. HowTo: exporter des classes C++ à partir d'une DLL