<?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[Linker Fehler 2005 beim mehrfachen includen von Macros]]></title><description><![CDATA[<p>Hallo,</p>
<p>um ein COM Objekt recht einfach zu benutzen habe ich mir ein paar Macros geschrieben. Das funktioniert auch super, wenn das Makro nur in einer cpp Datei benutzt wird.<br />
Möchte ich aber das Makro in mehreren cpp Dateien benutzen, d.h. ich includier die Header des Makros in die stdafx.h damit das schön überall bekannt ist, dann kommt für jedes include der Linkerfehler 2005.</p>
<p>Noch ein bisschen Code zum besseren Verstehen:</p>
<pre><code class="language-cpp">ILog * ILOG;
#define __init_log__()      {   HRESULT hr = CoInitialize(0);\
                                     hr = CoCreateInstance(CLSID_Log, NULL, CLSCTX_INPROC_SERVER, IID_ILog, (void**)&amp;ILOG); }
</code></pre>
<p>Log.h</p>
<p>Damit ich den Zeiger ILOG überall benutzen kann, muss ich ihn ja wohl auch überall includieren. Wie krieg ich dann den Linkerfehler weg?<br />
Ich könnte die Makros wegschmeissen, dann gehts. Das möcht ich aber nicht unbedingt.</p>
<p>F1 bringt:<br />
symbol already defined in object<br />
The given symbol, displayed in its decorated form, was multiply defined.</p>
<p>OK OK multiply defined. Aber wie krieg ich das weg!?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186554/linker-fehler-2005-beim-mehrfachen-includen-von-macros</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 06:15:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186554.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Jul 2007 08:13:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Linker Fehler 2005 beim mehrfachen includen von Macros on Tue, 10 Jul 2007 08:13:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>um ein COM Objekt recht einfach zu benutzen habe ich mir ein paar Macros geschrieben. Das funktioniert auch super, wenn das Makro nur in einer cpp Datei benutzt wird.<br />
Möchte ich aber das Makro in mehreren cpp Dateien benutzen, d.h. ich includier die Header des Makros in die stdafx.h damit das schön überall bekannt ist, dann kommt für jedes include der Linkerfehler 2005.</p>
<p>Noch ein bisschen Code zum besseren Verstehen:</p>
<pre><code class="language-cpp">ILog * ILOG;
#define __init_log__()      {   HRESULT hr = CoInitialize(0);\
                                     hr = CoCreateInstance(CLSID_Log, NULL, CLSCTX_INPROC_SERVER, IID_ILog, (void**)&amp;ILOG); }
</code></pre>
<p>Log.h</p>
<p>Damit ich den Zeiger ILOG überall benutzen kann, muss ich ihn ja wohl auch überall includieren. Wie krieg ich dann den Linkerfehler weg?<br />
Ich könnte die Makros wegschmeissen, dann gehts. Das möcht ich aber nicht unbedingt.</p>
<p>F1 bringt:<br />
symbol already defined in object<br />
The given symbol, displayed in its decorated form, was multiply defined.</p>
<p>OK OK multiply defined. Aber wie krieg ich das weg!?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322022</guid><dc:creator><![CDATA[electron]]></dc:creator><pubDate>Tue, 10 Jul 2007 08:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to Linker Fehler 2005 beim mehrfachen includen von Macros on Tue, 10 Jul 2007 08:22:33 GMT]]></title><description><![CDATA[<p>Das Makro ist nicht das Problem (das bleibt irgendwo auf dem Weg zum Compiler auf der Strecke), aber dein <code>ILog* ILOG;</code> - damit definierst du in jeder Übersetzungseinheit so einen Zeiger und der Linker stolpert dann darüber, daß er ein halbes Dutzend gleichnamige Variablen findet und nicht mehr weiß, wann welche zu verwenden ist. Als Lösungen kann ich dir zwei Varianten anbieten:</p>
<ol>
<li><code>static ILog* ILOG;</code><br />
Damit beschränkt sich die Sichtbarkeit jedes dieser Zeiger auf &quot;seine&quot; Übersetzungseinheit und der Linker bekommt nichts mehr davon mit. Allerdings bin ich mir nicht sicher, ob das wirklich das ist, was du beabsichtigst (jede ÜE hat ihre eigene Version von ILOG).</li>
<li><code>extern ILog* ILOG;</code><br />
Damit reduzierst du die Definition zu einer reinen Deklaration (mehrfache Deklarationen sind erlaubt) - definieren mußt du die Variable gesondert und in genau einer CPP-Datei (am besten die, wo du die Variable auch initialisieren willst).</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1322030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322030</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 Jul 2007 08:22:33 GMT</pubDate></item><item><title><![CDATA[Reply to Linker Fehler 2005 beim mehrfachen includen von Macros on Tue, 10 Jul 2007 11:36:29 GMT]]></title><description><![CDATA[<p>Ja, wenn ich die Makros weglasse , dann kann ich mit extern ILog* ILOG arbeiten. Aber mit den Makros gibt esProbleme mit den<br />
CLSID_Log, IID_ILog, ILOG usw, mit allen Variablen eben, di3e im Makro definiert sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322216</guid><dc:creator><![CDATA[electron]]></dc:creator><pubDate>Tue, 10 Jul 2007 11:36:29 GMT</pubDate></item><item><title><![CDATA[Reply to Linker Fehler 2005 beim mehrfachen includen von Macros on Tue, 10 Jul 2007 11:39:48 GMT]]></title><description><![CDATA[<p>In dem Makro dort oben werden doch gar keine Variablen definiert (außer hr - und das ist lokal, also für den Linker unwichtig). Du hast im ganzen Programm nur eine Version deiner Variablen, also solltest du die an eine Stelle zusammenfassen - und dort auch initialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322220</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 Jul 2007 11:39:48 GMT</pubDate></item><item><title><![CDATA[Reply to Linker Fehler 2005 beim mehrfachen includen von Macros on Tue, 10 Jul 2007 12:23:01 GMT]]></title><description><![CDATA[<p>OK OK noch mal ganz langsam. Ich versteh es bald selbst nicht mehr.</p>
<p>Mein COM Objekt liefert mir 2 Dateien, die ich includieren muss, darin steht zB:</p>
<pre><code class="language-cpp">EXTERN_C const IID IID_ILog;
und
const IID IID_ILog = {0x52E3E759,0xE99D,0x4F50,{0xB7,0x37,0x25,0x9C,0xD6,0x0A,0x1E,0xB9}};
</code></pre>
<p>Zusätzlich hab ich noch eine 3.Header mit anderen globalen Sachen. Damit ich keine 3 Header in allen Projekten includieren muss, habe ich eine 4. Header geschrieben mit diesen Makros, die diese Variablen beinhalten:</p>
<pre><code>#ifndef __log_glob_h_
#define __log_glob_h_

#include &quot;log.h&quot;
#include &quot;log_i.c&quot;
#include &quot;log_types.h&quot;

ILog * ILOG;
ITrace * ITRACE;

#define __init_log__      {   HRESULT hr = CoInitialize(0);\
                                     hr = CoCreateInstance([b]CLSID_Log[/b], NULL, CLSCTX_INPROC_SERVER, [b]IID_ILog[/b], (void**)&amp;[b]ILOG[/b]);\}
</code></pre>
<p>So, überwall, wo ich nun loggen will muss ich ILOG bekanntmachen und daher schreib ich:<br />
#include &quot;log_glob.h&quot;<br />
Der Linker meckert dann nämlich nicht nur wegen dem ILOG, sondern auch wegen dem CLSID_Log, wegen dem IID_Log, eben alle Variablen die in diesen mehrfach includierten Headern definiert sind. Und die definiere ich ja nicht mal selber, das macht das COM Objekt selber.</p>
<p>Wenn ich die Makros jetzt wegschmeisse und die 3 Header nur an einer Stelle includier und an allen anderen Stellen mit der Deklaration extern ILog* ILOG arbeite, dann gehts ja. Ich möchte aber die Makros in irgendeiner Form behalten, damit man zum benutzen des Logs nur 3 Zeilen Kode braucht, nämlich:</p>
<pre><code class="language-cpp">#include &quot;log_glob.h&quot;
__init_log__;
ILOG-&gt;write(txt);
</code></pre>
<p>und an ganz anderer Stelle nur noch 2 Zeilen:</p>
<pre><code class="language-cpp">#include &quot;log_glob.h&quot;
ILOG-&gt;write(txt);
</code></pre>
<p>Wie krieg ich den Linker zum Schweigen??</p>
<p>Gruß und vielen Dank schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322247</guid><dc:creator><![CDATA[electron]]></dc:creator><pubDate>Tue, 10 Jul 2007 12:23:01 GMT</pubDate></item><item><title><![CDATA[Reply to Linker Fehler 2005 beim mehrfachen includen von Macros on Tue, 10 Jul 2007 12:33:29 GMT]]></title><description><![CDATA[<p><code>#include &quot;log_i.c&quot;</code> - das ist übel (lass mich raten, dort steht die Definition der Variablen drin). .C Files werden nicht inkludiert, sondern parallel übersetzt und mitverlinkt.</p>
<p>(auf deutsch: Nimm diesen Eintrag aus deinem Header heraus und pack die &quot;log_i.c&quot; als eigenständige Quelldatei in dein Projekt rein)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322249</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 Jul 2007 12:33:29 GMT</pubDate></item></channel></rss>