<?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[Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once]]></title><description><![CDATA[<p>Hallo allerseits!</p>
<p>Ich wollte mein Projekt ein bisschen aufräumen und aus einer .cpp Datei zwei .cpp Dateien und einen Header .h machen.</p>
<p>[In der einen .cpp Datei werden Funktionen implementiert, in der anderen aufgerufen.]</p>
<p>Dieser Header muss dann natürlich in beiden .cpp Dateien eingebunden werden.</p>
<p>Und das bereitet wohl Probleme:</p>
<p>Beim Linken bekomme ich error, die z.B. so aussehen:</p>
<blockquote>
<p>Linking...<br />
3dfunctions.obj : error LNK2005: &quot;struct IDirect3D9 * g_pD3D&quot; (?g_pD3D@@3PAUIDirect3D9@@A) already defined in mfc-testDlg.obj</p>
</blockquote>
<p>und noch ein paar weitere &quot;already defined&quot; Meldungen.</p>
<p>Ich vermute, es liegt an der zweifachen Verwendung des Headers:<br />
Entferne ich den include dieses Headers aus einer der beiden .cpp Dateien, taucht dieser Error nicht mehr auf (dafür natürlich viele andere...).</p>
<p>Doppelte Definitionen wollte ich dabei eigentlich durch die übliche Header-Klammer vermeiden:</p>
<pre><code class="language-cpp">#ifndef _THREEDFUNCTIONS_H
#define _THREEDFUNCTIONS_H
...
...
#endif
</code></pre>
<p>Alternativ versuchte ich es auch mit</p>
<pre><code class="language-cpp">#pragma once
</code></pre>
<p>Beides führte zu oben genannten Fehlermeldungen.</p>
<p>Die <a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652" rel="nofollow">Microsoft Beschreibung des Error LNK 2005</a> habe ich mir zwar schon durchgelesen, werde aber nicht so recht daraus schlau, dort ist ja als Lösung etwas von Libaries die Rede, was solldas?<br />
(In der Headerdatei tauchen tatsächlich ein paar Libary Nennungen auf, allerdings kann ich darauf keine der Tipps der MS Seite anwenden:</p>
<pre><code class="language-cpp">#pragma comment(lib, &quot;d3d9.lib&quot;) // for Direct3DCreate9
#pragma comment(lib, &quot;d3dx9.lib&quot;) // for Direct3DCreate9
#pragma comment(lib, &quot;dxguid.lib&quot;) // for Direct3DCreate9
#pragma comment(lib, &quot;winmm.lib&quot;) //for timeGetTime
</code></pre>
<p>)</p>
<p>Hat jemand also eine Idee, woran das liegen könnte und wie ich diese Link-Errors loswerde?</p>
<p>Danke und Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/150707/problem-mit-doppelten-definitionen-trotz-ifndef-bzw-pragma-once</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 13:56:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/150707.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Jun 2006 16:19:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Mon, 19 Jun 2006 16:31:28 GMT]]></title><description><![CDATA[<p>Hallo allerseits!</p>
<p>Ich wollte mein Projekt ein bisschen aufräumen und aus einer .cpp Datei zwei .cpp Dateien und einen Header .h machen.</p>
<p>[In der einen .cpp Datei werden Funktionen implementiert, in der anderen aufgerufen.]</p>
<p>Dieser Header muss dann natürlich in beiden .cpp Dateien eingebunden werden.</p>
<p>Und das bereitet wohl Probleme:</p>
<p>Beim Linken bekomme ich error, die z.B. so aussehen:</p>
<blockquote>
<p>Linking...<br />
3dfunctions.obj : error LNK2005: &quot;struct IDirect3D9 * g_pD3D&quot; (?g_pD3D@@3PAUIDirect3D9@@A) already defined in mfc-testDlg.obj</p>
</blockquote>
<p>und noch ein paar weitere &quot;already defined&quot; Meldungen.</p>
<p>Ich vermute, es liegt an der zweifachen Verwendung des Headers:<br />
Entferne ich den include dieses Headers aus einer der beiden .cpp Dateien, taucht dieser Error nicht mehr auf (dafür natürlich viele andere...).</p>
<p>Doppelte Definitionen wollte ich dabei eigentlich durch die übliche Header-Klammer vermeiden:</p>
<pre><code class="language-cpp">#ifndef _THREEDFUNCTIONS_H
#define _THREEDFUNCTIONS_H
...
...
#endif
</code></pre>
<p>Alternativ versuchte ich es auch mit</p>
<pre><code class="language-cpp">#pragma once
</code></pre>
<p>Beides führte zu oben genannten Fehlermeldungen.</p>
<p>Die <a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652" rel="nofollow">Microsoft Beschreibung des Error LNK 2005</a> habe ich mir zwar schon durchgelesen, werde aber nicht so recht daraus schlau, dort ist ja als Lösung etwas von Libaries die Rede, was solldas?<br />
(In der Headerdatei tauchen tatsächlich ein paar Libary Nennungen auf, allerdings kann ich darauf keine der Tipps der MS Seite anwenden:</p>
<pre><code class="language-cpp">#pragma comment(lib, &quot;d3d9.lib&quot;) // for Direct3DCreate9
#pragma comment(lib, &quot;d3dx9.lib&quot;) // for Direct3DCreate9
#pragma comment(lib, &quot;dxguid.lib&quot;) // for Direct3DCreate9
#pragma comment(lib, &quot;winmm.lib&quot;) //for timeGetTime
</code></pre>
<p>)</p>
<p>Hat jemand also eine Idee, woran das liegen könnte und wie ich diese Link-Errors loswerde?</p>
<p>Danke und Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1080741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080741</guid><dc:creator><![CDATA[dong]]></dc:creator><pubDate>Mon, 19 Jun 2006 16:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Mon, 19 Jun 2006 17:33:54 GMT]]></title><description><![CDATA[<p>Probier mal /FORCE oder /FORCE:MULTIPLE<br />
bis Du den Fehler lokalisiert hast.</p>
<p>siehe z.B.: <a href="http://www.codeproject.com/buglist/linkererrors.asp?df=100&amp;forumid=15354&amp;exp=0&amp;select=527004" rel="nofollow">http://www.codeproject.com/buglist/linkererrors.asp?df=100&amp;forumid=15354&amp;exp=0&amp;select=527004</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1080804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080804</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Mon, 19 Jun 2006 17:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Mon, 19 Jun 2006 18:30:29 GMT]]></title><description><![CDATA[<p>Erhard Henkes schrieb:</p>
<blockquote>
<p>Probier mal /FORCE oder /FORCE:MULTIPLE<br />
bis Du den Fehler lokalisiert hast.</p>
</blockquote>
<p>Danke für den Tipp. Statt &quot;Error&quot; steht jetzt nur &quot;Warning&quot;, ansonsten bleiben die Fehlermeldungen zunächst gleich. (Dei Anwendung ist aber ausführbar.)</p>
<p>Danach kam allerdings die folgende Meldung:</p>
<blockquote>
<p>Generating code<br />
Finished generating code<br />
CIL library( CIL module) : warning LNK4006: &quot;float (* funktionswert)[101]&quot; (?funktionswert@@3PAY0GF@MA) already defined in CIL library( CIL module); second definition ignored<br />
CIL library( CIL module) : warning LNK4006: &quot;bool b_3DFenster&quot; (?b_3DFenster@@3_NA) already defined in CIL library( CIL module); second definition ignored</p>
</blockquote>
<p>Gehe ich also recht in der Annahme, dass diese CIL libary Probleme bereitet?</p>
<p>Ich habe dann versucht, sie zu ignorieren:<br />
ALT + F7 -&gt; Linker -&gt; Input -&gt; Ignore specific libary -&gt;<br />
Dort habe ich CIL.lib und testweise CIL eingetragen.<br />
Das brachte allerdings nichts (Die Fehlermeldungen blieben wie zuvor).</p>
<p>Was kann ich stattdessen machen?</p>
<p>Danke und Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1080851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080851</guid><dc:creator><![CDATA[dong]]></dc:creator><pubDate>Mon, 19 Jun 2006 18:30:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Mon, 19 Jun 2006 19:56:46 GMT]]></title><description><![CDATA[<p>Bau mal alles beim Kompilieren komplett neu auf und schau Dir alle Schalter genau an.<br />
<a href="http://msdn2.microsoft.com/en-US/library/1zzf962b.aspx" rel="nofollow">http://msdn2.microsoft.com/en-US/library/1zzf962b.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1080960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080960</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Mon, 19 Jun 2006 19:56:46 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Mon, 19 Jun 2006 20:16:44 GMT]]></title><description><![CDATA[<p>Erhard Henkes schrieb:</p>
<blockquote>
<p>Bau mal alles beim Kompilieren komplett neu auf</p>
</blockquote>
<p>Reicht dazu ein &quot;Rebuild Solution&quot;?</p>
<p>Erhard Henkes schrieb:</p>
<blockquote>
<p>und schau Dir alle Schalter genau an.</p>
</blockquote>
<p>Ähm: Was meinst Du mit &quot;Schalter&quot;? (Siehe Sig...)</p>
<p>Und hat die Fehlermeldung von oben (CIL libary) etwas zu sagen?</p>
<p>Danke und Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1080976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080976</guid><dc:creator><![CDATA[dong]]></dc:creator><pubDate>Mon, 19 Jun 2006 20:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Sun, 20 May 2007 20:54:40 GMT]]></title><description><![CDATA[<p>Ich stehe vor genau dem gleichen Problem mit genau den gleichen Resultaten.</p>
<p>Ich habe bei mir den Fehler</p>
<pre><code>CComplex.obj : error LNK2005: &quot;double __cdecl P2dBm(double)&quot; (?P2dBm@@YANN@Z) ist bereits in AdaptiveAlgorithm.obj definiert.
...
</code></pre>
<p>wobei der Fehler in den Klassen</p>
<p>LightModulator2D, LightModulator2DDoc, LightModulator2DView, MainFrm, PropertiesDlg, DlgPPM, PPMOutputDlg, GraphCtrl, Laserbeam, PlotCtrl, MfcPlot, Plot, CComplex, FastFourierTrans</p>
<p>auftritt und das bei jeder Funktion aus der Header Datei &quot;MathExt.h&quot;, was insgesammt 365 Fehlermeldungen bringt.</p>
<p>MathExt.h wird nur von CComplex.h geladen und enthält die Anweisungen</p>
<pre><code class="language-cpp">#ifndef _MATHEXT_H_
#define _MATHEXT_H_
...
double P2dBm(double P) { return 30.0+10.0*log10(P);}
...
</code></pre>
<p>Die Funktionen werden daher in der Header Datei definiert. CComplex wird wiederum nur geladen von</p>
<p>CComplex, Plot, Laserbeam, FastFourierTrans, GraphCtrl</p>
<p>AdaptiveAlgorithm, wo das ganze schon definiert sein worden soll lädt das ganze über -&gt;FastFourierTrans-&gt;CComplex-&gt;MatheExt.</p>
<p>Wenn ich den Linkerschalter</p>
<pre><code>/FORCE:MULTIPLE
</code></pre>
<p>einfüge dann werden daraus die Warnungen:</p>
<pre><code>CComplex.obj :warning LNK4006: &quot;double __cdecl P2dBm(double)&quot; (?P2dBm@@YANN@Z) ist bereits in &quot;AdaptiveAlgorithm.obj&quot; definiert; zweite Definition wird ignoriert.
...
</code></pre>
<p>Das bringt mir natürlich keine Lösung des Problems.</p>
<p>Ich wüsste gerne warum der Fehler überhaupt auftritt und wie ich ihn verhindere.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288743</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Sun, 20 May 2007 20:54:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Sun, 20 May 2007 20:52:38 GMT]]></title><description><![CDATA[<p>dong schrieb:</p>
<blockquote>
<blockquote>
<p>Linking...<br />
3dfunctions.obj : error LNK2005: &quot;struct IDirect3D9 * g_pD3D&quot; (?g_pD3D@@3PAUIDirect3D9@@A) already defined in mfc-testDlg.obj</p>
</blockquote>
</blockquote>
<p>Die Variable g_pD3D wurde mehrfach definiert. Variablendefinitionen haben in der Regel in Headern nichts verloren. Dort sollte nur eine Deklaration stehen, also</p>
<pre><code class="language-cpp">extern IDirect3D9* g_pD3D;
</code></pre>
<p>oder so ähnlich. Das hat im Übrigen nichts mit Mehrfacheinbindung des Headers in einer Übersetzungseinheit zu tun (dagegen schützen include-guards), sondern mit der Einbindung in mehreren Übersetzungseinheiten. Definitionen von Variablen und Funktionen (außer inline) dürfen nur einmal im Programm existieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288747</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 20 May 2007 20:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Sun, 20 May 2007 21:03:29 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Ich wüsste gerne warum der Fehler überhaupt auftritt und wie ich ihn verhindere.</p>
</blockquote>
<p>Ich habe es jetzt behoben indem ich alle Funktionen aus MathExt.h in Mathext.cpp verschoben habe und diese dem Projekt ebenfalls hinzugefügt habe.</p>
<p>Nur stellt sich mir nun die Frage warum das auftritt und wie die Schreiber von Bibliotheken das Problem lösen.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288751</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Sun, 20 May 2007 21:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Mon, 21 May 2007 04:18:19 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Nur stellt sich mir nun die Frage warum das auftritt</p>
</blockquote>
<p>Weil du Funktionen oder Variablen in einer Headerdatei definiert hast. Sobald diese Headerdatei in mehr als einer Übersetzungseinheit landet, sind diese Funktionen und Variablen mehrfach definiert, und der Linker weiß nicht, welche er benutzen soll. Davor schützen dich auch die Include Guards nicht, die wirken immer nur in <em>einer</em> Übersetzungseinheit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288795</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 21 May 2007 04:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit doppelten Definitionen trotz #ifndef bzw. #pragma once on Mon, 21 May 2007 07:33:51 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>pospiech schrieb:</p>
<blockquote>
<p>Ich wüsste gerne warum der Fehler überhaupt auftritt und wie ich ihn verhindere.</p>
</blockquote>
<p>Ich habe es jetzt behoben indem ich alle Funktionen aus MathExt.h in Mathext.cpp verschoben habe und diese dem Projekt ebenfalls hinzugefügt habe.</p>
<p>Nur stellt sich mir nun die Frage warum das auftritt und wie die Schreiber von Bibliotheken das Problem lösen.</p>
<p>Matthias</p>
</blockquote>
<p>Man kann auch einfach &quot;inline&quot; davor schreiben, dann darf die Definition der Funktion auch in 100 TUs vorkommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288838</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 21 May 2007 07:33:51 GMT</pubDate></item></channel></rss>