<?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[Linken inkompatibler Bibliotheken erkennen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Bei gewissen C++-Bibliotheken sehe ich folgendes Problem: Leute linken eine Version einer statischen oder dynamischen Bibliothek, die mit dem Projekt inkompatibel ist. &quot;Inkompatibel&quot; kann z.B. unterschiedliche Compilerversionen, Mischen von Debug/Release oder verschiedene Compilerflags bedeuten. In manchen Fällen wird das Problem bereits automatisch zur Linkzeit erkannt, allerdings nicht immer. Oft kracht es dann mit einer Zugriffsverletzung beim Aufruf einer entsprechenden Funktion, teilweise passiert auch gar nichts. Erschwerend ist natürlich, dass das Ganze je nach Compiler und Betriebssystem wieder etwas anders aussieht. Unter Linux ist z.B. das Linken von Release-Bibliotheken in Debug-Builds unproblematisch. Ausserdem sind Begriffe wie &quot;Release&quot;/&quot;Debug&quot; schwammig definiert, am portabelsten hält man sich dafür vielleicht an das <code>NDEBUG</code> -Makro.</p>
<p>Was für Möglichkeiten seht ihr, zumindest einen Teil solcher Fehler zu erkennen und mittels vernünftiger Fehlermeldungen mitzuteilen? Etwas konkreter:</p>
<p><strong>1. Linkzeit</strong><br />
Wie weit kann man statische Bibliotheken und Importbibliotheken bereits zur Linkzeit überprüfen? Hinweise auf nicht-portable Mechanismen sind durchaus willkommen, habt ihr für einen spezifischen Compiler/Linker dazu Erfahrung?</p>
<p>Meine spontane Idee mit C++-Mitteln: Konfigurationen mittels Präprozessor in einen Funktionsnamen einbauen. Falls sich die Konfiguration der Bibliothek und des User-Projekts unterscheidet, wird die Funktionsdefinition nicht gefunden. Damit lässt sich ein aussagekräftiger Linkerfehler erzeugen.</p>
<pre><code>// Ganzer Codeauszug in Library.hpp

// Einzelne Konfigurationen mit Präprozessor zu Bezeichnern verarbeiten
// Bezeichner für Debug oder Release
#ifdef NDEBUG
  #define DEBUG_OR_RELEASE Release
#else
  #define DEBUG_OR_RELEASE Debug
#endif

// Bezeichner für Compiler + Version
#if defined(_MSC_VER)
  #define COMPILER PP_CAT(MicrosoftCompiler, _MSC_VER)
#elif ...
 ...
#endif

// Alle Bezeichner zusammenhängen =&gt; eindeutiger Funktionsname
#define LINKER_CONFIG PP_CAT(COMPILER, DEBUG_OR_RELEASE)
#define FUNCTION_NAME PP_CAT(linkerTest_, LINKER_CONFIG)

// Funktionsdeklaration (Definition in Library.cpp)
int DLL_API FUNCTION_NAME();

// Linken der Funktion erzwingen. Kann das wegoptimiert werden?
const int dummy = FUNCTION_NAME();
</code></pre>
<p><strong>2. Laufzeit</strong><br />
Falls man den Test ganz oder teilweise auf die Laufzeit verlegt, wie würdet ihr vorgehen?</p>
<p>Meine Idee hierzu: Konfiguration separat in .cpp- und .hpp-Dateien der Bibliothek ermitteln und vergleichen.</p>
<pre><code>// Ganzer Codeauszug in Library.hpp

// Klasse mit Konfiguration
struct LinkerConfig
{
    const char* compilerName;
    int         compilerVersion;
    bool        debug;
    ...
}; 

// inline =&gt; Code liegt im User-Projekt
inline LinkerConfig getUserConfig()
{
    ...
}

// definiert in Library.cpp =&gt; Code liegt in Bibliothek
LinkerConfig DLL_API getLibConfig();

// Vergleicht User-Projekt- und Bibliotheks-Einstellungen
inline int compareConfig()
{
   if (getUserConfig() != getLibConfig());
       warning(); // Ausgabe, Assert, Breakpoint, was auch immer
   return 13;
}

// Code-Ausführung erzwingen. Kann das wegoptimiert werden?
const int dummy = compareConfig();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/321685/linken-inkompatibler-bibliotheken-erkennen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Jul 2026 02:05:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321685.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Nov 2013 22:47:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Wed, 20 Nov 2013 22:47:49 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Bei gewissen C++-Bibliotheken sehe ich folgendes Problem: Leute linken eine Version einer statischen oder dynamischen Bibliothek, die mit dem Projekt inkompatibel ist. &quot;Inkompatibel&quot; kann z.B. unterschiedliche Compilerversionen, Mischen von Debug/Release oder verschiedene Compilerflags bedeuten. In manchen Fällen wird das Problem bereits automatisch zur Linkzeit erkannt, allerdings nicht immer. Oft kracht es dann mit einer Zugriffsverletzung beim Aufruf einer entsprechenden Funktion, teilweise passiert auch gar nichts. Erschwerend ist natürlich, dass das Ganze je nach Compiler und Betriebssystem wieder etwas anders aussieht. Unter Linux ist z.B. das Linken von Release-Bibliotheken in Debug-Builds unproblematisch. Ausserdem sind Begriffe wie &quot;Release&quot;/&quot;Debug&quot; schwammig definiert, am portabelsten hält man sich dafür vielleicht an das <code>NDEBUG</code> -Makro.</p>
<p>Was für Möglichkeiten seht ihr, zumindest einen Teil solcher Fehler zu erkennen und mittels vernünftiger Fehlermeldungen mitzuteilen? Etwas konkreter:</p>
<p><strong>1. Linkzeit</strong><br />
Wie weit kann man statische Bibliotheken und Importbibliotheken bereits zur Linkzeit überprüfen? Hinweise auf nicht-portable Mechanismen sind durchaus willkommen, habt ihr für einen spezifischen Compiler/Linker dazu Erfahrung?</p>
<p>Meine spontane Idee mit C++-Mitteln: Konfigurationen mittels Präprozessor in einen Funktionsnamen einbauen. Falls sich die Konfiguration der Bibliothek und des User-Projekts unterscheidet, wird die Funktionsdefinition nicht gefunden. Damit lässt sich ein aussagekräftiger Linkerfehler erzeugen.</p>
<pre><code>// Ganzer Codeauszug in Library.hpp

// Einzelne Konfigurationen mit Präprozessor zu Bezeichnern verarbeiten
// Bezeichner für Debug oder Release
#ifdef NDEBUG
  #define DEBUG_OR_RELEASE Release
#else
  #define DEBUG_OR_RELEASE Debug
#endif

// Bezeichner für Compiler + Version
#if defined(_MSC_VER)
  #define COMPILER PP_CAT(MicrosoftCompiler, _MSC_VER)
#elif ...
 ...
#endif

// Alle Bezeichner zusammenhängen =&gt; eindeutiger Funktionsname
#define LINKER_CONFIG PP_CAT(COMPILER, DEBUG_OR_RELEASE)
#define FUNCTION_NAME PP_CAT(linkerTest_, LINKER_CONFIG)

// Funktionsdeklaration (Definition in Library.cpp)
int DLL_API FUNCTION_NAME();

// Linken der Funktion erzwingen. Kann das wegoptimiert werden?
const int dummy = FUNCTION_NAME();
</code></pre>
<p><strong>2. Laufzeit</strong><br />
Falls man den Test ganz oder teilweise auf die Laufzeit verlegt, wie würdet ihr vorgehen?</p>
<p>Meine Idee hierzu: Konfiguration separat in .cpp- und .hpp-Dateien der Bibliothek ermitteln und vergleichen.</p>
<pre><code>// Ganzer Codeauszug in Library.hpp

// Klasse mit Konfiguration
struct LinkerConfig
{
    const char* compilerName;
    int         compilerVersion;
    bool        debug;
    ...
}; 

// inline =&gt; Code liegt im User-Projekt
inline LinkerConfig getUserConfig()
{
    ...
}

// definiert in Library.cpp =&gt; Code liegt in Bibliothek
LinkerConfig DLL_API getLibConfig();

// Vergleicht User-Projekt- und Bibliotheks-Einstellungen
inline int compareConfig()
{
   if (getUserConfig() != getLibConfig());
       warning(); // Ausgabe, Assert, Breakpoint, was auch immer
   return 13;
}

// Code-Ausführung erzwingen. Kann das wegoptimiert werden?
const int dummy = compareConfig();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2366705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2366705</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 20 Nov 2013 22:47:49 GMT</pubDate></item><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Wed, 20 Nov 2013 23:14:50 GMT]]></title><description><![CDATA[<p>Bei letzterem Vorschlag kommt mir das so vor, als würde dann der Check evtl. auch abstürzen <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=";)"
      alt="😉"
    /></p>
<p>Ich habe keinen Ratschlag parat, aber möchte anmerken, dass es seit CMake und Konsorten immer einfacher wird, sich die Bibs einfach in's Projekt zu integrieren, sodass man gar keine Probleme mehr in diese Richtung hat. Wenn die Quellen nicht vorhanden sind, ist man wahrscheinlich sowieso am besten mit C-Bibs bedient...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2366711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2366711</guid><dc:creator><![CDATA[EinerVonUns]]></dc:creator><pubDate>Wed, 20 Nov 2013 23:14:50 GMT</pubDate></item><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Thu, 21 Nov 2013 15:42:14 GMT]]></title><description><![CDATA[<p>EinerVonUns schrieb:</p>
<blockquote>
<p>Ich habe keinen Ratschlag parat, aber möchte anmerken, dass es seit CMake und Konsorten immer einfacher wird, sich die Bibs einfach in's Projekt zu integrieren, sodass man gar keine Probleme mehr in diese Richtung hat.</p>
</blockquote>
<p>CMake hilft nur bedingt. Es gibt genügend Fälle, wo man im Projekt ohne CMake effizienter ist, gerade wenn man gute Projektverwaltung wie Visual Studio hat und Portabilität nicht von Anfang an ein Thema ist.</p>
<p>Davon abgesehen kann man auch mit CMake sehr leicht Fehler machen. Die Fehlerrate hängt effektiv von der Qualität der Skripte ab, genauer gesagt welche Fehlerquellen der Entwickler explizit einkalkuliert. Zum einen sind originale CMake-Fehlermeldungen nicht besonders aussagekräftig, ausserdem wird vieles nicht automatisch erkannt (z.B. konnte ich in einem MinGW-Projekt Visual-Studio-Bibliotheken als Abhängigkeit angeben, der Fehler wurde erst beim Linken erkennbar). Wenn der Benutzer einen Pfad angibt, indem zu linkende Bibliotheken zwar vorhanden, aber inkompatibel mit dem User-Projekt sind, hat er wieder verloren. Vieles muss immer noch nicht-portabel gelöst werden. Jedes grössere Projekt hat explizite Fallunterscheidungen nach Compiler drin, was dem Abstraktionsgedanken zuwider läuft. Aber das nur nebenbei...</p>
<p>EinerVonUns schrieb:</p>
<blockquote>
<p>Wenn die Quellen nicht vorhanden sind, ist man wahrscheinlich sowieso am besten mit C-Bibs bedient...</p>
</blockquote>
<p>Welche Quellen meinst du? Ich ziele auf C++-Bibliotheken ab, die Open Source sind. Ich will mich nicht auf C beschränken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2366840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2366840</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 21 Nov 2013 15:42:14 GMT</pubDate></item><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Thu, 21 Nov 2013 17:35:28 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>EinerVonUns schrieb:</p>
<blockquote>
<p>Ich habe keinen Ratschlag parat, aber möchte anmerken, dass es seit CMake und Konsorten immer einfacher wird, sich die Bibs einfach in's Projekt zu integrieren, sodass man gar keine Probleme mehr in diese Richtung hat.</p>
</blockquote>
<p>CMake hilft nur bedingt. Es gibt genügend Fälle, wo man im Projekt ohne CMake effizienter ist, gerade wenn man gute Projektverwaltung wie Visual Studio hat und Portabilität nicht von Anfang an ein Thema ist.</p>
</blockquote>
<p>Hast du mal ein Beispiel wo Visual Studio besser ist als CMake, wenn es um das gleiche Ziel geht? Ich generiere VS-Projekte immer mit CMake. Keine Ahnung warum man das anders machen sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2366852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2366852</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Thu, 21 Nov 2013 17:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Sat, 23 Nov 2013 10:45:46 GMT]]></title><description><![CDATA[<p>Ich arbeite normalerweise direkt in Visual Studio. CMake wird allenfalls verwendet, um das Projekt zu portieren. CMake-generierte VS-Projekte finde ich nicht ideal zum längeren Arbeiten, da die Projektstruktur weniger konfigurierbar ist (man hat zusätzliche Projekte wie ZERO_CHECK, BUILD, INSTALL; Include-Dateien werden standardmässig nicht zum Projekt hinzugefügt; man hat keine Filter). Ich arbeite lieber mit der integrierten Projektverwaltung als einem externen Makefile. Einstellungen sind über die GUI einfacher zu ändern als im Skript (man muss nicht all die compiler-spezifischen Schalter auswendig kennen).</p>
<p>Zurück zum Thema: Ich habe mal ein bisschen herumexperiementiert, der erste Code mit der Linkzeit-Erkennung funktioniert recht gut. Das Problem ist, dass <code>NDEBUG</code> nicht zuverlässig definiert wird (da es primär das <code>assert</code> -Makro steuert), für MSVC bin ich daher auf <code>_DEBUG</code> umgestiegen.</p>
<p>Momentan prüfe ich folgende Eigenschaften:</p>
<ul>
<li>Build-Type (Release/Debug)</li>
<li>Linkage (Static/Dynamic)</li>
<li>Compiler (Name und Version)</li>
</ul>
<p>Ein Teil davon wird zwar ohnehin erkannt, allerdings kann ich so genauere Fehlermeldungen erzeugen. Andere Ideen, was recht eindeutig auf inkompatible Binaries hindeuten könnte? Verwendete Standard-/Laufzeitbibliotheken (wie könnte ich die am besten erkennen)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367290</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 23 Nov 2013 10:45:46 GMT</pubDate></item><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Sat, 23 Nov 2013 14:15:49 GMT]]></title><description><![CDATA[<p>Vielleicht ist auch Boost.Predef hilfreich? Bin ich gerade drüber gestolpert.<br />
<a href="http://www.boost.org/doc/libs/1_55_0/libs/predef/doc/html/index.html" rel="nofollow">http://www.boost.org/doc/libs/1_55_0/libs/predef/doc/html/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367346</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Sat, 23 Nov 2013 14:15:49 GMT</pubDate></item><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Sat, 23 Nov 2013 17:01:23 GMT]]></title><description><![CDATA[<p>Sieht nützlich aus, danke <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/2367424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367424</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 23 Nov 2013 17:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Sat, 23 Nov 2013 17:18:37 GMT]]></title><description><![CDATA[<p>Tyroxx, wie löst Du denn das Problem, dass das mit der Synchronisation von Dateien in Solutions und dem CMake-Script etwas hakelig ist? In VS hinzufügen und dann im CMake-Skript per Hand eintragen finde ich schon etwas nervig. Ich hab mir schön öfter Gedanken darüber gemacht, die Scripte um ein paar Meta-Informationen anzureichern und mir einen Service zu schreiben, der sln und Skripte synchronisiert, aber naja, komme irgendwie nicht dazu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367435</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Sat, 23 Nov 2013 17:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Sat, 23 Nov 2013 18:30:04 GMT]]></title><description><![CDATA[<p>decimad schrieb:</p>
<blockquote>
<p>Tyroxx, wie löst Du denn das Problem, dass das mit der Synchronisation von Dateien in Solutions und dem CMake-Script etwas hakelig ist? In VS hinzufügen und dann im CMake-Skript per Hand eintragen finde ich schon etwas nervig.</p>
</blockquote>
<p>CMake berücksichtigt natürlich keine Änderungen, die man am VS-Projekt vornimmt. Hinzufügen/Umbenennen/Löschen von Quelldateien erfordert bei meinen Setups nur ein erneutes &quot;Generate&quot; im CMake GUI, weil das <a href="https://github.com/TyRoXx/serialization/blob/1cafe46d705be1f05ba102bf8f7ae793083118e6/src/test/CMakeLists.txt" rel="nofollow">CMake-Skript</a> einfach alle Dateien in seinem Verzeichnis hinzufügt. VS fragt dann, ob die geänderten Projekte neu geladen werden sollen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Ich kann das Problem noch nicht ganz nachvollziehen. VS lässt es bei C++ gar nicht zu gegen <code>.lib</code> -Dateien unterschiedlicher Compiler-Versionen oder Debug-Modi zu linken. Konflikte zwischen statischen und dynamischen Bibliotheken erzeugen ebenfalls sofort Linker-Fehler.<br />
Bei GCC muss man nur mit <code>-std=c++0x</code> aufpassen und uralte Compiler-Versionen (3.x) bzw ABIs vermeiden.<br />
Beschreibe doch mal genau was &quot;inkompatibel&quot; für dich bedeutet.</p>
<p>CMake hilft auch nur das eigentliche Problem unter dem Teppich zu kehren: C++ fehlt ein Modulsystem.</p>
<pre><code>$ echo -e &quot;namespace boost = import(\&quot;boost\&quot;, ver &gt;= \&quot;1.55\&quot;);\nint main() {boost::thread t;}&quot; &gt; test.cpp
$ cpppm deps test.cpp
boost ver &gt;= 1.55
$ cpppm install boost
$ c++ test.cpp
$ ./a.out
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2367466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367466</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 23 Nov 2013 18:30:04 GMT</pubDate></item><item><title><![CDATA[Reply to Linken inkompatibler Bibliotheken erkennen on Sun, 24 Nov 2013 10:12:13 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Ich kann das Problem noch nicht ganz nachvollziehen. VS lässt es bei C++ gar nicht zu gegen <code>.lib</code> -Dateien unterschiedlicher Compiler-Versionen oder Debug-Modi zu linken.</p>
</blockquote>
<p>Doch, Debug und Release kann man teilweise mischen, verschiedene Compilerversionen ebenfalls. Ersteres habe ich erst gerade selbst ausprobiert, um die Checks zu testen.</p>
<p>Hier ein paar Beispiele aus dem SFML-Forum, wo genau diese Fehler begangen wurden, und erst zur Laufzeit zu einem Fehler &quot;Stack around the variable .. was corrupted&quot; geführt haben:<br />
<a href="http://en.sfml-dev.org/forums/index.php?topic=3119" rel="nofollow">http://en.sfml-dev.org/forums/index.php?topic=3119</a><br />
<a href="http://en.sfml-dev.org/forums/index.php?topic=4858" rel="nofollow">http://en.sfml-dev.org/forums/index.php?topic=4858</a><br />
<a href="http://en.sfml-dev.org/forums/index.php?topic=7885" rel="nofollow">http://en.sfml-dev.org/forums/index.php?topic=7885</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367567</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 24 Nov 2013 10:12:13 GMT</pubDate></item></channel></rss>