Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat
error C3861: "MessageZ": Bezeichner wurde nicht gefunden.
Zitat von »"David_pb"«
Versuch das:
C-/C++-Quelltext
1 2 3 4 5 6 #pragma once extern "C" { void TUTORIAL_API testmsg(const std::string& any); }
@Nico: Es gibt keinen Grund "pragma" grundsätzlich zu vermeiden, ist ja schließlich Standard. Zum Teil bietet diese Funktionalität Vorteile gegenüber alternativen Lösungen an (vgl #pragma once und Includeguards).
Außerdem verwendet er die WinAPI, wieso also nicht die vorteilhafte Alternative wählen?
Zitat
In the C and C++ programming languages, #pragma once is a non-standard but widely supported preprocessor directive designed to cause the current source file to be included only once in a single compilation. Thus, #pragma once serves the same purpose as include guards, but in less code and without the possibility for name clashes.
Zitat
#ifdef TUTORIAL_EXPORTS
#define TUTORIAL_API __declspec(dllexport)
#else
#define TUTORIAL_API __declspec(dllimport)
#endif
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
#if defined(TUTORIAL_EXPORTS) && defined(WIN32)
#define TUTORIAL_API __declspec(dllexport)
#elif defined(WIN32)
#define TUTORIAL_API __declspec(dllimport)
#else
#define TUTORIAL_API __stdcall
#endif
|
Ehm ... du kannst Lesen? Nicht nur Schreiben? Dann ließ mal bitte meine Antwort.Zitat
Du hast mittlerweile echt Spaß daran mich zu flamen was?
Zitat
In the C and C++ programming languages, #pragma once is a non-standard but widely supported preprocessor directive designed to cause the current source file to be included only once in a single compilation. Thus, #pragma once serves the same purpose as include guards, but in less code and without the possibility for name clashes.
http://en.wikipedia.org/wiki/Pragma_once
Es gehört nicht zum Standard. Damit ist es zu vermeiden. Ein einfaches #ifdef, #define, #endif reicht und ist portabler.
Der einzigste Windows-Code den ich hier sehe, ist die WinMain. Und die kann man auch am besten per #ifdef WIN32 bedingt kompilieren.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include "engine.h" int WINAPI DllMain(HINSTANCE DllHandle, unsigned long ReasonForCall, void* Reserved) { switch(ReasonForCall) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; default: break; } return 1; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#ifndef ENGINE_H #define ENGINE_H #include <windows.h> #ifdef ENGINE_EXPORTS #define ENGINE_API __declspec(dllexport) #else #define ENGINE_API __declspec(dllimport) #endif #include "test.h" #endif |
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
#include "engine.h" void ENGINE_API msg_test() { std::cout << "Hello World!" << std::endl; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
#ifndef TEST_H #define TEST_H #include <iostream> void ENGINE_API msg_test(); #endif |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
#include "engine.h" #pragma comment(lib, "engine.lib") int main() { msg_test(); std::cin.get(); return 0; } |
C-/C++-Quelltext |
|
1 |
void ENGINE_API msg_test2();
|
C-/C++-Quelltext |
|
1 2 3 4 |
void ENGINE_API msg_test2() { std::cout << "Next Text!" << std::endl; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 |
#include "engine.h" #pragma comment(lib, "engine.lib") int main() { msg_test(); msg_test2(); // DAS HIER GEADDED! std::cin.get(); return 0; } |
Zitat
1>c:\users\daniel\desktop\projekte\uebung\main\main.cpp(16) : error C3861: "msg_test2": Bezeichner wurde nicht gefunden.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#ifndef TEST_H #define TEST_H #if (_MSC_VER >= 1300) #pragma once #endif // (_MSC_VER >= 1300) #include <iostream> void ENGINE_API msg_test_one() { std::cout << "1 ..." << std::endl; } void ENGINE_API msg_test_two() { std::cout << "2 ..." << std::endl; } void ENGINE_API msg_test_three() { std::cout << "3 ..." << std::endl; } void ENGINE_API msg_test_bought() { std::cout << "Meins!" << std::endl; } #endif // TEST_H |
Quellcode |
|
1 2 3 4 5 6 7 |
int main() { msg_test(); //msg_test2(); // hier der Fehler std::cin.get(); return 0; } |
Zitat
------ Erstellen gestartet: Projekt: main, Konfiguration: Debug Win32 ------
Kompilieren...
main.cpp
Verknüpfen...
Das Manifest wird eingebettet...
Das Buildprotokoll wurde unter "file://[..]/forum\Uebung\main\Debug\BuildLog.htm" gespeichert.
main - 0 Fehler, 0 Warnung(en)
========== Erstellen: 1 erfolgreich, Fehler bei 0, 0 aktuell, 0 übersprungen ==========
Werbeanzeige