<?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[Die Sache mit den Bibliotheken]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>ich sinniere gerade über die Möglichkeiten eine Bibliothek zu verwenden.</p>
<p>Zum Einen gibt es den Unterschied, dass ich einfach mittels <code>#include</code> etwas einfügen kann, wie ich es z.B. von Boost kenne. Was mich dann nur wundert: Wo liegt das dann? Ich finde z.B. in dem Verzeichnis <code>/usr/lib</code> ein paar Dateien <code>libbosst_[..]</code> .<br />
Ich nehme an, dass der Verzeichnisname <code>lib</code> für Library, also Bibliothek steht.</p>
<p>Zum Anderen gibt es die <a href="http://www.gnu.org/software/gsl/" rel="nofollow">GSL</a>, die ich auch einfach mittels <code>#include&lt;gsl/...&gt;</code> einbinden kann, allerdings finde ich die ganzen header Dateien auch in <code>/usr/include/gsl</code> , während ich ich <code>/usr/include</code> nichts zu boost finde. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Dann geht das ganze weiter, dass ich bei boost keine Tags im Makefile setzen muss, während ich bei der GSL beim Linken <code>-lm -lgsl -lgslcblas</code> mitgeben muss, während der erste Buchstabe <code>l</code> (kleines L) für Library, also wieder Bibliothek, steht. Wieso muss ich das bei Boost nicht machen?</p>
<p>Und schließlich gibt es noch den Unterschied, dass ich ganze Verzeichnisse angeben muss, wo die Bibliothek liegen soll. Ich nehme an, dass dieser Fall daher kommt, dass ich eine Bibliothek nicht über den Paketmanager von Linux installiert habe und der Compiler sie deshalb nicht dort findet, wo er standardmäßig mittels <code>#include&lt;..&gt;</code> sucht.</p>
<p>Ich schätze, dass Teile der Antwort den Unterschied zwischen einer Shared und einer Static Library bezeichnen, doch finde ich die unterschiedliche Anwendung noch etwas ominös.</p>
<p>Viele Grüße,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322731/die-sache-mit-den-bibliotheken</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 15:44:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322731.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 04 Jan 2014 19:11:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Sat, 04 Jan 2014 19:11:34 GMT]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>ich sinniere gerade über die Möglichkeiten eine Bibliothek zu verwenden.</p>
<p>Zum Einen gibt es den Unterschied, dass ich einfach mittels <code>#include</code> etwas einfügen kann, wie ich es z.B. von Boost kenne. Was mich dann nur wundert: Wo liegt das dann? Ich finde z.B. in dem Verzeichnis <code>/usr/lib</code> ein paar Dateien <code>libbosst_[..]</code> .<br />
Ich nehme an, dass der Verzeichnisname <code>lib</code> für Library, also Bibliothek steht.</p>
<p>Zum Anderen gibt es die <a href="http://www.gnu.org/software/gsl/" rel="nofollow">GSL</a>, die ich auch einfach mittels <code>#include&lt;gsl/...&gt;</code> einbinden kann, allerdings finde ich die ganzen header Dateien auch in <code>/usr/include/gsl</code> , während ich ich <code>/usr/include</code> nichts zu boost finde. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Dann geht das ganze weiter, dass ich bei boost keine Tags im Makefile setzen muss, während ich bei der GSL beim Linken <code>-lm -lgsl -lgslcblas</code> mitgeben muss, während der erste Buchstabe <code>l</code> (kleines L) für Library, also wieder Bibliothek, steht. Wieso muss ich das bei Boost nicht machen?</p>
<p>Und schließlich gibt es noch den Unterschied, dass ich ganze Verzeichnisse angeben muss, wo die Bibliothek liegen soll. Ich nehme an, dass dieser Fall daher kommt, dass ich eine Bibliothek nicht über den Paketmanager von Linux installiert habe und der Compiler sie deshalb nicht dort findet, wo er standardmäßig mittels <code>#include&lt;..&gt;</code> sucht.</p>
<p>Ich schätze, dass Teile der Antwort den Unterschied zwischen einer Shared und einer Static Library bezeichnen, doch finde ich die unterschiedliche Anwendung noch etwas ominös.</p>
<p>Viele Grüße,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375127</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Sat, 04 Jan 2014 19:11:34 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Sat, 04 Jan 2014 19:15:44 GMT]]></title><description><![CDATA[<p><a href="http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html" rel="nofollow">http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375128</guid><dc:creator><![CDATA[google]]></dc:creator><pubDate>Sat, 04 Jan 2014 19:15:44 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Sat, 04 Jan 2014 20:02:23 GMT]]></title><description><![CDATA[<p>Wenn du libs aus dem Packetmanager hollst sind diese im Ordner:</p>
<pre><code>/usr/include
/usr/lib
</code></pre>
<p>Wenn du libs von fremden Quellen installierst sind diese im Ordner:</p>
<pre><code>/usr/local/include
/usr/local/lib
</code></pre>
<p>Das macht aber keinen unterschied, weil beide Ordner durchsucht werden.</p>
<p>Boost brauch nur für wenige Libs gelinkt werden:<br />
<a href="http://www.boost.org/doc/libs/1_55_0/more/getting_started/unix-variants.html#header-only-libraries" rel="nofollow">http://www.boost.org/doc/libs/1_55_0/more/getting_started/unix-variants.html#header-only-libraries</a></p>
<p>Dabei deine Fragen nichts mit C++ zu tun haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375135</guid><dc:creator><![CDATA[exploit126]]></dc:creator><pubDate>Sat, 04 Jan 2014 20:02:23 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Mon, 06 Jan 2014 07:14:35 GMT]]></title><description><![CDATA[<p>exploit126 schrieb:</p>
<blockquote>
<p>Dabei deine Fragen nichts mit C++ zu tun haben.</p>
</blockquote>
<p>Okay Yoda. <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>
<p>Dann soll ein Moderator doch bitte diesen Thread in den richtigen Bereich verschieben.</p>
<p>Aber meine Frage mit den Tags ist nach wie vor offen, z.B. wie für die <a href="http://www.gnu.org/software/gsl/manual/html_node/Linking-programs-with-the-library.html#Linking-programs-with-the-library" rel="nofollow">GSL hier zum Linken angegeben</a></p>
<pre><code>-lgsl -lgslcblas -lm
</code></pre>
<p>Sind das Überreste aus <code>C</code> oder warum muss das beim Linken nochmal explizit angeben, während es z.B. bei Boost genügt einfach die nötigen Header Dateien einzubinden.</p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375442</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Mon, 06 Jan 2014 07:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Mon, 06 Jan 2014 09:30:38 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<pre><code>-lgsl -lgslcblas -lm
</code></pre>
<p>Sind das Überreste aus <code>C</code> oder warum muss das beim Linken nochmal explizit angeben, während es z.B. bei Boost genügt einfach die nötigen Header Dateien einzubinden.</p>
<p>Gruß,<br />
-- Klaus.</p>
</blockquote>
<p>boost ist größtenteils headeronly, d.h. die Headerdateien reichen.<br />
GSL braucht neben den Deklerationen auch die Definitionen im Sourcecode, weswegen du die vorkompilierten Sourcecodedateien brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375456</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 06 Jan 2014 09:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Mon, 06 Jan 2014 12:19:03 GMT]]></title><description><![CDATA[<p>Das -lm ist aber tatsächlich ein Überrest aus C und in C++ nicht nötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375513</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 06 Jan 2014 12:19:03 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Mon, 06 Jan 2014 12:24:08 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das -lm ist aber tatsächlich ein Überrest aus C und in C++ nicht nötig.</p>
</blockquote>
<p>Das hatte noch nie was mit C zu tun, das ist ein Überrest aus historischen GCC-Designentscheidungen für ihren C-Compiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375516</guid><dc:creator><![CDATA[überrest]]></dc:creator><pubDate>Mon, 06 Jan 2014 12:24:08 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Mon, 06 Jan 2014 12:44:27 GMT]]></title><description><![CDATA[<p>überrest schrieb:</p>
<blockquote>
<p>Das hatte noch nie was mit C zu tun, das ist ein Überrest aus historischen GCC-Designentscheidungen für ihren C-Compiler.</p>
</blockquote>
<p>Nein. Das kommt zwar nicht aus dem C-Sprachstandard, aber war schon so lange bevor der GCC entstanden ist. Also aus Tradition <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/2375521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375521</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 06 Jan 2014 12:44:27 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Mon, 06 Jan 2014 15:23:08 GMT]]></title><description><![CDATA[<p>Also ich verstehe es noch nicht so recht:</p>
<p>Ich stelle mir das z.B. so vor, dass ich bei einer static library den Quellcode quasi in mein Programm kopiere, welches dann kompiliert wird. D.h. ich benötige lediglich die header Dateien, dass der Kompiler weiß woher er die Quellcodeschnipsel kriegt?</p>
<p>Bei einer shared library werden eher die vorkompilierten Funktionen an dieser Stelle des Quellcodes aufgerufen. D.h. ich benötige keine header Dateien mehr, weil mich der genaue Quellcode der implementierten Funktionen eh nicht interessiert - bestenfalls die Deklaration für das Interface.</p>
<p>Dafür muss der Kompiler wissen, dass er die Funktionen aufrufen soll? Also die als Bibliothek zusammengefassten Funktionen? D.h. wenn ich beim Linken <code>-lgsl</code> angebe, dann wird die Bibliothek, also das Paket <code>libgsl</code> (oder so ähnlich) durchsucht nach den vorkompilierten Funktionen?</p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375602</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Mon, 06 Jan 2014 15:23:08 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache mit den Bibliotheken on Mon, 06 Jan 2014 16:31:17 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>Ich stelle mir das z.B. so vor, dass ich bei einer static library den Quellcode quasi in mein Programm kopiere, welches dann kompiliert wird.</p>
</blockquote>
<p>Nein, hier ist schon falsch. Die Bibliotheken sind schon fertig übersetzt. In den Headern stehen nur Deklarationen. Ob das dann statisch oder dynamisch gelinkt wird, tut dabei nichts zur Sache.</p>
<p>Beispiel: Quellcode der Bibliothek libfoo:<br />
foo.cpp</p>
<pre><code>int foo(int i)
{
  return 2*i;
}
</code></pre>
<p>Das wird spätestens beim Installieren der Bibliothek (traditionell bei Open Source Software) oder auch vorher vom Hersteller (traditionell bei Closed Source Software) oder von jemand anderem (typisches Vorgehen bei Linuxdistributionen) übersetzt. Da kommt dann eine statische Bibliothek wie (ich nutze hier typische Linuxnamenskonvention) lifoo.a und/oder eine dynamische Bibliothek wie <a href="http://libfoo.so" rel="nofollow">libfoo.so</a> heraus. In beiden Fällen steht in der Bibliotheksdatei übersetzter Quellcode von der Funktion drin, also das was du erhalten würdest, wenn du den Code selber übersetzen würdest (aber nicht linken, das geht ja noch nicht). Beispielsweise mit gcc:</p>
<pre><code>g++ foo.cpp -c -o foo.o
</code></pre>
<p>Und dann passend zusammen geschnürt für das Bibliotheksdateiformat (welches übrigens nicht sehr anspruchsvoll ist).</p>
<p>Damit man die Funktione korrekt benutzen kann, muss der Compiler wissen, wie sie aufzurufen ist. Das muss er wissen, damit er kontrollieren kann, ob du die Funktion im Quellcode richtig benutzt hast (z.B. ob du foo auch wirklich mit nur einem Argument benutzt und das auch ein int (oder kompatibles) ist) und um den korrekten Code für den Aufruf zu erzeugen. Dazu reicht die Signatur der Funktion, die er aus der Deklaration bekommt:<br />
foo.h</p>
<pre><code>#ifndef FOO_H
#define FOO_H

int foo(int);

#endif
</code></pre>
<p>Wenn er dann dein Programm übersetzt hat, dann steht an der Stelle wo foo() aufgerufen wird auch nur das: Dass da eine Funktion namens <code>int foo(int)</code> aufgerufen werden soll. Der Linker nimmt dann (entweder statisch oder dynamisch) deinen Programmcode und den Programmcode aus der Bilbiothek und setzt das zu einem Gesamtprogramm zusammen. Das heißt (in der Regel) nicht, dass er den Code der Funktion foo inline am Ort des Aufrufs einsetzt, sondern dass er die übersetzten Funktionen alle in eine Datei schreibt (die Executable) und an die Stelle der Aufrufe schreibt, wohin in der Datei an der Stelle gesprungen werden soll.</p>
<p>Bei Bibliotheken die nur Header haben (vieles von Boost, aber auch die STL aus der C++-Standardbibliothek) ist hingegen tatsächlich aller Code in den Headern. Oder es ist gar kein Code, weil es nur ein paar typedefs oder ähnliches sind (zum Beispiel cstddef). Dazu muss der Code natürlich inline sein, um doppelte Definitionen zu verhindern. Dies kommt meistens vor bei Templates, die auch automatisch inline sind. Da fällt auch gleich auf, dass es sich bei der STL und großen Teilen von Boost gerade eben um Sammlungen von Templates handelt, deswegen sind die auch Header only. Warum Templates (fast) immer inline sein müssen hat technische Gründe, wie aus Templates Code erzeugt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375625</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 06 Jan 2014 16:31:17 GMT</pubDate></item></channel></rss>