La bibliothèque de liens dynamiques ne génère pas de fichier .lib lorsqu'il est compilé (Visual Studio C ++ Express)

StackOverflow https://stackoverflow.com/questions/5019809

  •  14-11-2019
  •  | 
  •  

Question

Dans le cadre de l'apprentissage C ++, j'ai écrit une simple bibliothèque de classe + qui le fait référence. Tout construit, sauf que la bibliothèque de classe ne génère pas de fichier .lib, ce qui se traduit par l'application lançant un "lien: erreurs fatal lnk1104: impossible d'ouvrir le fichier". Cela semble très raisonnable; De toute évidence, si un fichier nécessaire n'est pas là, il y a une erreur et c'est fatal. (Note latérale: je n'ai pas encore de livre)

Donc, je suis allé chercher des raisons pour lesquelles un fichier .lib pourrait ne pas être généré. Soit dit en passant, mon recherche de recherche est plutôt faible. Tout ce que j'ai trouvé, c'est que si la bibliothèque n'avait pas de balises __DeclsSpec (Dllexport), elle n'exporterait pas un .lib.

Je publierai maintenant les contenus d'en-tête et .cpp de la bibliothèque de classe (une simple classe "console" avec une méthode "écriture (std :: string)").

Entê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 lorsque j'ai tagué 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 défini pour générer une bibliothèque de liens dynamiques.

Merci.

Était-ce utile?

La solution

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 le laisser indéfini 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 les classes C ++ à partir d'une DLL

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top