Erstellen einer dll und Zugreifen auf die dll

  • C++

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Erstellen einer dll und Zugreifen auf die dll

    Hallo
    Ich habe mir nach Anweisung eine kleine dynamic link Library in C++ erstellt.

    C-Quellcode

    1. ​#pragma once
    2. #include <string>
    3. // person.h
    4. #ifndef PERSON_H
    5. #define PERSON_H
    6. class Person
    7. {
    8. public:
    9. Person(const std::string& name, int age);
    10. std::string getName() const;
    11. int getAge() const;
    12. private:
    13. std::string m_name;
    14. int m_age;
    15. };
    16. #endif // !PERSON_H


    und ´dazu

    C-Quellcode

    1. ​#include "pch.h"
    2. #include "framework.h"
    3. #include "person.h"
    4. #include <string>
    5. // person.h
    6. Person::Person(const std::string& name, int age)
    7. : m_name(name), m_age(age) {}
    8. std::string Person::getName() const {
    9. return m_name;
    10. }
    11. int Person::getAge() const {
    12. return m_age;
    13. }


    Lässt sich kompilieren und erzeugt im Ausgabeverzeichnis eine Person.dll .

    "C:\Users\Arno\source\repos\Person\x64\Debug"


    Danach hab ich mir eine kleine Konsolenanwendung PeronClient erstellt, die auf die dll zugreifen soll.

    C-Quellcode

    1. #include <iostream>
    2. #include "Person.h"
    3. int main()
    4. {
    5. std::cout << "Hello World!\n";
    6. Person person("Max Mustermann", 42);
    7. std::cout << person.getName() << " ist " << person.getAge() << " Jahre alt." << std::endl;
    8. }


    beim Kompilieren kommen mehrere dieser Fehlermeldung:

    Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol ""public: __cdecl Person::Person(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)"

    Ich habe im Eigenschaftenfenster von PersonClient, .... Zusätzliche Includeverzeichnisse den Pfad zu meiner Person.h - Datei eingestellt.

    Wenn ich hier den Pfad zu meiner dll einstelle, dann markiert er die Codezeile "#include Person.h" als Fehler, wenn ich die Endung auf .dll einstelle, ist der Fehler weg, aber ich kann nicht kompilieren.

    Bei C# und VB habe ich keine Probleme mit dem Erstellen und Verwenden von dll's.

    ich habe auch dieses hier 1 zu 1 nachgebaut, gleicher Fehler.

    learn.microsoft.com/de-de/cpp/…library-cpp?view=msvc-170


    Wo liegt hier mein Fehler?

    LG Arno
    @samosnabrueck

    Ich habe kurz ein Beispiel gemacht.

    Quellcode

    1. In der DLL Person
    2. *********************
    3. Linker >> ImportBibliothek
    4. Eigenschaften aufrufen und kurz prüfen wie der Pfad ist der Library
    5. $(OutDir)$(TargetName).lib
    6. Linker >> SubSystem
    7. Prüfen ob Konsole (/SUBSYSTEM:CONSOLE)
    8. Linker >> ZielComputer
    9. MachineX64 (/MACHINE:X64)


    Quellcode

    1. In der Exe PersonTest
    2. ***********************
    3. C/C++ >> Zusätzliche IncludeVerzeichnisse
    4. $(SolutionDir)..\Person;%(AdditionalIncludeDirectories)
    5. Linker >> SubSystem
    6. Prüfen ob Konsole (/SUBSYSTEM:CONSOLE)
    7. Linker >> ZielComputer
    8. MachineX64 (/MACHINE:X64)
    9. Linker >> Zusätzliche BibliotheVerzeichnisse
    10. $(OutDir)


    setze über der main die: #pragma comment( lib, "person.lib")

    C-Quellcode

    1. ​#pragma comment( lib, "person.lib")
    2. int main()
    3. {
    4. std::cout << "Hello World!\n";
    5. std::string name = "Max Mustermann";
    6. Person person(name, 42);
    7. std::cout << person.getName() << " ist " << person.getAge() << " Jahre alt." << std::endl;
    8. return 0;
    9. }


    person.h

    C-Quellcode

    1. ​#pragma once
    2. #ifndef __PERSON_H__
    3. #define __PERSON_H__
    4. #include <iostream>
    5. #include <string>
    6. #include <vector>
    7. #include <iostream>
    8. #include <Windows.h>
    9. #define MYTF_EXP __declspec(dllexport)
    10. class MYTF_EXP Person
    11. {
    12. public:
    13. Person(std::string& name, int age);
    14. std::string& getName() const;
    15. int getAge() const;
    16. private:
    17. std::string& m_name;/*_stdcall*/
    18. int m_age;
    19. };
    20. #endif

    person.cpp

    C-Quellcode

    1. ​#include "pch.h"
    2. #include "framework.h"
    3. #include "person.h"
    4. Person::Person(std::string& name, int age)
    5. : m_name(name), m_age(age) {}
    6. std::string& Person::getName() const
    7. {
    8. return m_name;
    9. }
    10. int Person::getAge() const
    11. {
    12. return m_age;
    13. }


    Ich denke so sollte es dann funktionieren. Habe die Zipdatei im Anhang gelegt.

    Freundliche Grüsse

    exc-jdbi
    Dateien
    • TestPerson.zip

      (9,78 kB, 32 mal heruntergeladen, zuletzt: )
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!