<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[(Einfachste) DLLs erstellen und einbinden]]></title><description><![CDATA[<p>Ich habe mir mittels des DLL Templates von Code::Blocks eine kleine DLL mit folgendem Code erstellt, der sich auch problemlos kompilieren lässt (es entstehen eine .dll und eine .a):</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT
#endif

void DLL_EXPORT hallo()
{
    cout&lt;&lt;&quot;Hallo Welt&quot;&lt;&lt;endl;
}
</code></pre>
<p>Ich habe noch nie mit Präprozessorbefehlen gearbeitet und verstehe daher diese Zeilen nicht (bitte erklären wenn möglich). Aber das ist nicht meine eigentliche Frage. Diese lautet - Wie binde ich diese wunderhübsche DLL in ein weiteres normales Projekt ein und wie rufe ich die Funktion hallo() auf, sodass auf dem Bildschirm der Text &quot;Hallo Welt&quot; erscheint?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/190757/einfachste-dlls-erstellen-und-einbinden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 01 Jul 2026 18:56:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/190757.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Aug 2007 14:58:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 14:58:18 GMT]]></title><description><![CDATA[<p>Ich habe mir mittels des DLL Templates von Code::Blocks eine kleine DLL mit folgendem Code erstellt, der sich auch problemlos kompilieren lässt (es entstehen eine .dll und eine .a):</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT
#endif

void DLL_EXPORT hallo()
{
    cout&lt;&lt;&quot;Hallo Welt&quot;&lt;&lt;endl;
}
</code></pre>
<p>Ich habe noch nie mit Präprozessorbefehlen gearbeitet und verstehe daher diese Zeilen nicht (bitte erklären wenn möglich). Aber das ist nicht meine eigentliche Frage. Diese lautet - Wie binde ich diese wunderhübsche DLL in ein weiteres normales Projekt ein und wie rufe ich die Funktion hallo() auf, sodass auf dem Bildschirm der Text &quot;Hallo Welt&quot; erscheint?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352385</guid><dc:creator><![CDATA[alfonsospringer]]></dc:creator><pubDate>Sun, 26 Aug 2007 14:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 15:21:37 GMT]]></title><description><![CDATA[<p>Eigentlich besteht so ein projekt (mindestens) aus header und cpp. Im Header steht dann sowas hier:</p>
<pre><code class="language-cpp">#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT
#endif

void DLL_EXPORT hallo();
</code></pre>
<p>im cpp sowas:</p>
<pre><code class="language-cpp">#include &quot;header.h&quot;

void DLL_EXPORT hall()
{
  cout &lt;&lt; &quot;hallo&quot; &lt;&lt; endl;
}
</code></pre>
<p>Der Header wird überall eingebunden, wo du die Funktionen aus der DLL benutzen willst. Wenn die dll kompiliert und gelinkt wird, dann hat code::blocks automatisch dem gcc ein -DBUILD_DLL mitegeben. Also ist BUILD_DLL definiert, wenn die DLl gebaut wird. Damit expandiert DLL_EXPORT zu __declspec(dllexport). D.h. deine DLL macht alle Funktionen/Objekte/sontwas die mit dem Makro DLL_EXPORT ausgezeichnet sind öffneltich, sodass andere sie benutzen können.<br />
Wenn du jetzt in dein anderen Projekt den header einbindest, ist BUILD_DLL nicht definiert, also wird DLL_EXPORT zu nichts expandiert, denn dein hauptrojekt exportiert ja ncihts in eine DLL sondern benutzt nur die Funktion. Dazu die präprozessorbefehle.</p>
<p>So, zu einbindung: wie gesagt, im hauptorgramm den header einbinden und kompilieren. Kompilieren tut er dann, linken nicht. Er sagt nämlich, dass er nicht weiß was hallo() denn ist (also unresolved external symbol). Deshalb musst du im Hauptprogramm noch die .a einbinden. Die sagt dem Linker, dass er beim programmstart die dll laden muss, denn da steht deine funktion hallo() drin und alles müsste funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352399</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 26 Aug 2007 15:21:37 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 15:25:41 GMT]]></title><description><![CDATA[<p>zu deiner zweten frage:<br />
Du erzeugst ganz normal ein projekt. Einbinden: Du hast die header deiner dll (Deklarationen der schnittstelle), die kannst du includieren.<br />
Damit die referenzen korrekt aufgelöst werden, gibt es die .a oder .lib datei. Die linkst du ganz normal zu deinem programm, wie eine statische lib (linker settings). Dann sollten die Codes aus der DLL aufgerufen werden.</p>
<p>erste frage:<br />
#ifdef BUILD_DLL<br />
#define DLL_EXPORT __declspec(dllexport)</p>
<p>bedeutet, wenn BUILD_DLL gesetzt ist (build options, #defines), dann wird DLL_EXPORT als __declspec(dllexport) definiert. __declspec(dllexport) muss vor funktionen die exportiert werden sollen, geschrieben werden:</p>
<pre><code class="language-cpp">__declspec(dllexport) int test();
</code></pre>
<p>bei klassen</p>
<pre><code class="language-cpp">class __declspec(dllexport) klasse;
</code></pre>
<p>damit du nicht jedes mal __declspec(dllexport) schreiben musst, wird das makri definiert.<br />
wenn dann mal keine DLL gebaut werden soll aus den codes, dann ist DLL_EXPORT definiert und wird durch &quot;&quot; ersetzt und stört nicht weiter.</p>
<p>-edit-<br />
da war einer schneller <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";D"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352404</guid><dc:creator><![CDATA[piXelshooter]]></dc:creator><pubDate>Sun, 26 Aug 2007 15:25:41 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 16:06:40 GMT]]></title><description><![CDATA[<p>es klappt - vielen dank</p>
<p>p.s.: kann mir villeicht jemand sagen, was die Fehlermeldung<br />
warning: no newline at end of file bedeutet ? Jedenfalls nicht das was sie übersetzt bedeutet ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352418</guid><dc:creator><![CDATA[alfonsospringer]]></dc:creator><pubDate>Sun, 26 Aug 2007 16:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 16:13:40 GMT]]></title><description><![CDATA[<p>Ganz einfach, es fehlt eine Leerzeile am Ende der Datei <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352422</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Sun, 26 Aug 2007 16:13:40 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 16:21:02 GMT]]></title><description><![CDATA[<p>und warum verursacht das ne Warnung? -&gt; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352427</guid><dc:creator><![CDATA[alfonsospringer]]></dc:creator><pubDate>Sun, 26 Aug 2007 16:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 18:13:44 GMT]]></title><description><![CDATA[<p>Weil der Standard eben einfach will dass eine Zeile mit Newline abgeschlossen wird. Auch die letzte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352517</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 26 Aug 2007 18:13:44 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 19:11:01 GMT]]></title><description><![CDATA[<p>Und wie bindet man dll's ein deren .a's man nicht hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352567</guid><dc:creator><![CDATA[alfonsospringer]]></dc:creator><pubDate>Sun, 26 Aug 2007 19:11:01 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 19:14:55 GMT]]></title><description><![CDATA[<p>über LoadLibrary(), dann hast du aber den Nachteil, dass du auf keine Klassen zugreifen kannst.<br />
nur Variablen und Funktionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352568</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Sun, 26 Aug 2007 19:14:55 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 19:45:26 GMT]]></title><description><![CDATA[<p>und wie ginge das mit meiner oben genannten dll?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352591</guid><dc:creator><![CDATA[alfonsospringer]]></dc:creator><pubDate>Sun, 26 Aug 2007 19:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 20:03:37 GMT]]></title><description><![CDATA[<p>dann musst du deine funktion erstmal in einen extern &quot;C&quot; Block hauen.</p>
<pre><code class="language-cpp">// header
extern &quot;C&quot;
{
  int __declspec(dllexport) hallo();
}

// cpp
int hallo() { return 1; }
</code></pre>
<p>und im hauptorgramm dann so:</p>
<pre><code class="language-cpp">HMODULE dll = LoadLibrary(&quot;Deinedll-datei.dll&quot;);
typedef int(*fn)(); // Funktionszeigertyp
fn zeiger_auf_deine_funktion = (fn)GetProcAddress(dll, &quot;hallo&quot;);
cout &lt;&lt; zeiger_auf_deine_funktion() &lt;&lt; endl;
</code></pre>
<p>So kurz gesagt. Jedenfalls mit loadlibrary und getprocaddress. Das extern &quot;C&quot; muss sein, wei lder C++-Compiler sonst name-mangeling anwendet, also er verschlüsselt deine funktionsnamen, damit man auch überladene funktionen schreiben kann, was in extern &quot;C&quot; nicht geht. Dafür heißt deine funktion aber auch so, wie du sie nennst und nciht mit kryptischen @ und so drin.<br />
[/cpp]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352601</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 26 Aug 2007 20:03:37 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 20:27:57 GMT]]></title><description><![CDATA[<p>Main.cpp:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

typedef void (*hallo_ptr)(void);

int main()
{
  HMODULE dll_handle = LoadLibrary(&quot;deine.dll&quot;);

  hallo_ptr hallo_fn = (hallo_ptr)GetProcAddress(dll_handle, &quot;hallo&quot;);
  (hallo_fn)();

  FreeLibrary(dll_handle);
}
</code></pre>
<p>hallo.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT
#endif

extern &quot;C&quot; //C++ Name-Mangling umgehen
{
  void DLL_EXPORT hallo()
  {
      cout&lt;&lt;&quot;Hallo Welt&quot;&lt;&lt;endl;
  }
}
</code></pre>
<p>Grüße,</p>
<p>Martin</p>
<p>EDIT: Da war jemand schneller <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352606</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Sun, 26 Aug 2007 20:27:57 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Sun, 26 Aug 2007 21:26:20 GMT]]></title><description><![CDATA[<p>Sag mal, wir sind hier im C++-Forum und nicht im WinAPI-Forum...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352641</guid><dc:creator><![CDATA[verwundert]]></dc:creator><pubDate>Sun, 26 Aug 2007 21:26:20 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Mon, 27 Aug 2007 09:16:49 GMT]]></title><description><![CDATA[<p>geht es auch ohne winapi?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352783</guid><dc:creator><![CDATA[alfonsospringer]]></dc:creator><pubDate>Mon, 27 Aug 2007 09:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Mon, 27 Aug 2007 10:02:13 GMT]]></title><description><![CDATA[<p>Falls du damit meinst, mit der Standard-C++ Library: nein<br />
AFAIK bietet aber z.B. wxWidgets Funktionen zum platformunabhängigen Laden von dynamischen Bibliotheken an...</p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352842</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Mon, 27 Aug 2007 10:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Mon, 27 Aug 2007 10:05:19 GMT]]></title><description><![CDATA[<p>findet man denn zu den meisten dll's die dazu passenden .a's und header dateien?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352845</guid><dc:creator><![CDATA[alfonsospringer]]></dc:creator><pubDate>Mon, 27 Aug 2007 10:05:19 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Mon, 27 Aug 2007 10:22:04 GMT]]></title><description><![CDATA[<p>Das kommt darauf an: Wenn die DLL dazu gedacht ist, von dir verwendet zu werden, und du sie nicht einfach aus irgendeinem Programm klaust, sollte in jedem Fall irgendeine Form von Importbibliothek beiligen. Kann halt passieren, dass dort keine Bibliotheken für den GCC beiligen, sondern nur für MS-VC++ oder BCB, keine Ahnung, ob es Tools gibt, die diese entsprechend umwandeln können.<br />
Fein raus bist du, wenn es sich um OpenSource Bibliotheken handelt, da diese meist direkt für den GCC entwickelt wurden und, falls nicht schon Binaries beiligen, unkompliziert gebaut werden können.<br />
Header liegen in jedem Fall bei, da du die Bibliothek ja sonst überhaupt nicht verwenden kannst...</p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352858</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Mon, 27 Aug 2007 10:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Mon, 27 Aug 2007 11:35:38 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-403.html" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352918</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 27 Aug 2007 11:35:38 GMT</pubDate></item><item><title><![CDATA[Reply to (Einfachste) DLLs erstellen und einbinden on Mon, 27 Aug 2007 12:05:37 GMT]]></title><description><![CDATA[<p>alfonsospringer schrieb:</p>
<blockquote>
<p>geht es auch ohne winapi?</p>
</blockquote>
<p>lol <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1352963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1352963</guid><dc:creator><![CDATA[SkriptProfessor]]></dc:creator><pubDate>Mon, 27 Aug 2007 12:05:37 GMT</pubDate></item></channel></rss>