<?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[Exportierte Symbole in .dll und header Datei Organistation]]></title><description><![CDATA[<p>Angenommen ich habe eine shared library (.dll), welche 2 Funktionen zur Verfügung stellen soll:</p>
<p>* <strong>quadriere</strong>(double foo)<br />
* <strong>bestimmeWetter</strong>(MeineDatumKlasse *foo)</p>
<p><strong>bestimmeWetter</strong> ist allerdings eine komplexe Funktion, die mehrere Hilfsfunktionen aufruft um ihre Berechnungen anzustellen. Diese sollen aber nicht als Symbole außerhalb der .dll zur Verfügung stehen.</p>
<p>Was ist gängige Praxis in so einer Situation?</p>
<p>Nimmt man verschiedene Header, einmal mit Hilfsfunktionen und einmal ohne? (Die Symbole stehen dann aber trotzdem in der .dll und könnten über so etwas wie dependancy walker ausgelesen werden)</p>
<p>Deklariert man sie garnicht und schreibt sie in einen namenlosen namespace? (Wodurch man sie nur in einer Datei nutzen kann, was irgendwie ungünstig ist)</p>
<p>Gibt es in C++ so etwas wie einen 'exportiere diese Symbole nicht' Befehl? Falls ja, wie sieht dann ein zur Bibliothek passender header aus?</p>
<p>Wenn mich jemand aufklären könnte oder mir sagen kann nach was ich suchen muss wäre das super :).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339402/exportierte-symbole-in-dll-und-header-datei-organistation</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 04:14:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339402.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Aug 2016 16:25:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Exportierte Symbole in .dll und header Datei Organistation on Sat, 27 Aug 2016 16:25:31 GMT]]></title><description><![CDATA[<p>Angenommen ich habe eine shared library (.dll), welche 2 Funktionen zur Verfügung stellen soll:</p>
<p>* <strong>quadriere</strong>(double foo)<br />
* <strong>bestimmeWetter</strong>(MeineDatumKlasse *foo)</p>
<p><strong>bestimmeWetter</strong> ist allerdings eine komplexe Funktion, die mehrere Hilfsfunktionen aufruft um ihre Berechnungen anzustellen. Diese sollen aber nicht als Symbole außerhalb der .dll zur Verfügung stehen.</p>
<p>Was ist gängige Praxis in so einer Situation?</p>
<p>Nimmt man verschiedene Header, einmal mit Hilfsfunktionen und einmal ohne? (Die Symbole stehen dann aber trotzdem in der .dll und könnten über so etwas wie dependancy walker ausgelesen werden)</p>
<p>Deklariert man sie garnicht und schreibt sie in einen namenlosen namespace? (Wodurch man sie nur in einer Datei nutzen kann, was irgendwie ungünstig ist)</p>
<p>Gibt es in C++ so etwas wie einen 'exportiere diese Symbole nicht' Befehl? Falls ja, wie sieht dann ein zur Bibliothek passender header aus?</p>
<p>Wenn mich jemand aufklären könnte oder mir sagen kann nach was ich suchen muss wäre das super :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2506797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2506797</guid><dc:creator><![CDATA[FirefoxMetzger]]></dc:creator><pubDate>Sat, 27 Aug 2016 16:25:31 GMT</pubDate></item><item><title><![CDATA[Reply to Exportierte Symbole in .dll und header Datei Organistation on Sat, 27 Aug 2016 18:23:36 GMT]]></title><description><![CDATA[<p>Was juckt es dich, ob die Symbole mit dem Dependency Walker zu sehen sind?</p>
<p>Grundsätzlich gibt es in Bibliotheken öffentliche und private Header. Bei einer Auslieferung ohne Sourcecode legt man nur die öffentlichen bei.</p>
<p>Funktionen aus Windows-DLLs kann man nur binden, wenn sie mit dllexport im Header exportiert wurden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2506807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2506807</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 27 Aug 2016 18:23:36 GMT</pubDate></item><item><title><![CDATA[Reply to Exportierte Symbole in .dll und header Datei Organistation on Sat, 27 Aug 2016 18:35:16 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>für interne Hilfsfunktionen verwenden viele Projekte separate Header, in denen nur die internen Funktionen und Symbole deklariert werden. Diese haben teilweise ein &quot;priv_&quot; oder &quot;private_&quot; Präfix/Suffix oder befinden sich in einem &quot;private&quot;/&quot;internal&quot;/&quot;detail&quot;-Unterverzeichnis. Diese Header werden dann üblicherweise auch nicht zusammen mit der Bibliothek &quot;installiert&quot;, landen also nicht im include-Verzeichnis des Anwenders der Bibliothek sondern werden lediglich beim Kompilieren der Bibliothek eingebunden.</p>
<p>Ich selbst lege solche internen Header meist direkt zusammen mit den <code>.cpp</code> -Dateien im &quot;source&quot;-Verzeichnis der Bibliothek ab und nicht im &quot;include&quot;-Geschwisterverzeichnis (dort packe ich nur die öffentlichen Header rein). Das sieht dann in etwa so aus:</p>
<pre><code>[include]
   mylibrary.hpp
[source]
   fancyfunction.cpp
   helper.cpp
   helper.hpp
</code></pre>
<p>Einen wirklichen Standard gibt es da nicht, lass dich am besten von ein paar Open Source-Projekten inspirieren und such dir was passendes aus, was du für sinnvoll erachtest.</p>
<p>Was die Sichtbarkeit von Symbolen in der DLL angeht: Mit Visual Studio muss man Symbole mit <code>__declspec(dllexport)</code> explizit für den Export markieren. Wenn du das für die internen Funktionen weglässt, sollten diese in der DLL auch nicht mehr sichtbar sein (können aber trotzdem intern verwendet werden).</p>
<p>Bei GCC sind alle Symbole per default sichtbar (werden von der DLL exportiert), soweit ich weiss lässt sich das aber mit dem compilerspezifischen Attribut <code>__attribute__ ((visibility &quot;hidden&quot;)))</code> für einzelne Symbole deaktivieren. Das sollte dann eigentlich den selben Effekt haben wie unter MSVC <code>__declspec(dllexport)</code> wegzulassen.</p>
<p>Gruss,<br />
Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2506808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2506808</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Sat, 27 Aug 2016 18:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to Exportierte Symbole in .dll und header Datei Organistation on Sat, 27 Aug 2016 19:19:58 GMT]]></title><description><![CDATA[<p>Ich war bisher (aus welchen Gründen auch immer) der Meinung, dass grundsätzlich alle Symbole immer sichtbar sind. Das mit __declspec(dllexport) kommt mir also echt entgegen.</p>
<p>Der Hintergrund ist einfach der, dass ich nach außen ein sauberes Interface präsentieren will. Welche Funktionen dann letztendlich wie intern voneinander abhängen kann ich dann nach belieben verändern ohne Angst haben zu müssen, dass irgendein Genie genau diese Funktion in seinem Programm benuzt.</p>
<p>Danke für die schnelle Antwort <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/2506815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2506815</guid><dc:creator><![CDATA[FirefoxMetzger]]></dc:creator><pubDate>Sat, 27 Aug 2016 19:19:58 GMT</pubDate></item><item><title><![CDATA[Reply to Exportierte Symbole in .dll und header Datei Organistation on Sun, 28 Aug 2016 06:19:51 GMT]]></title><description><![CDATA[<p>FirefoxMetzger schrieb:</p>
<blockquote>
<p>Der Hintergrund ist einfach der, dass ich nach außen ein sauberes Interface präsentieren will. Welche Funktionen dann letztendlich wie intern voneinander abhängen kann ich dann nach belieben verändern ohne Angst haben zu müssen, dass irgendein Genie genau diese Funktion in seinem Programm benuzt.</p>
</blockquote>
<p>Prinzipiell ein Ansatz, den ich auch bevorzugen würde, allerdings halte ich die Wahrscheinlichkeit, dass das tatsächlich passiert für extrem gering, solange man die internen Funktionen nicht über den öffentlichen Header exponiert.<br />
Ich glaube mit sowas muss man erst rechnen wenn man an einer weit verbreiteten proprietären API arbeitet (ich denke da z.B. an diverse undokumentierten Funktionen der Windows-API - habe gerade kürzlich einen Vortrag über<br />
Race Conditions bei Dateisystemzugriffen gesehen, bei der eine besonders effizente Lösung eine solche Funktion benötigte).<br />
Bei einer gewöhnlichen Bibliothek wird wohl kaum einer auf die abstruse Idee kommen solche internen Funktionen zu verwenden. Und falls doch, dann ist denen sowieso nicht mehr zu helfen - mit so einer Grundeinstellung werden<br />
sie sich noch ganz andere Probleme einfangen, auf die man als Bibliotheksentwickler keinen Einfluss mehr hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2506841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2506841</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Sun, 28 Aug 2016 06:19:51 GMT</pubDate></item></channel></rss>