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.

33
demandé sur jon-hanson 2011-02-16 20:25:49

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

25
répondu Nathanael 2011-02-16 18:54:02