<?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[Das Verhalten von extern &amp;quot;C&amp;quot;]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade mehrere Stunden daran gesessen, den MinGW g++ compiler C-kompatible Symbole erzeugen zu lassen.</p>
<p>Das C++ Mangling Verhalten gewöhnt man ja dem Compiler mit extern &quot;C&quot; ab. Der MinGW zeigt da einen für meinen Geschmack etwas seltsames Verhalten:</p>
<p>Ich habe mit Java´s JNI gebastelt, und da ist das ja so, dass einem die C Header autogeneriert werden.</p>
<p>Java erzeugt mit so etwas, wichtig ist hier eigentlich nur dass &quot;extern&quot;.</p>
<pre><code class="language-cpp">#ifdef __cplusplus
extern &quot;C&quot; {
#endif
/*
 * Class:     Renderer_RenderDevice
 * Method:    createDisplay
 * Signature: (IIZ)V
 */
JNIEXPORT void JNICALL Java_Renderer_RenderDevice_createDisplay
  (JNIEnv *, jclass, jint, jint, jboolean);

/*
 * Class:     Renderer_RenderDevice
 * Method:    setTitle
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_Renderer_RenderDevice_setTitle
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
</code></pre>
<p>Wenn ich nun auf diese Weise eine Implementierung angebe, erzeugt der MinGW trotzdem falsche Symbole. (Immer noch C++)</p>
<pre><code class="language-cpp">JNIEXPORT void JNICALL Java_Renderer_RenderDevice_createDisplay
            (JNIEnv* env, jobject o, jint width, jint height, jboolean fullscreen) {

        std::cout &lt;&lt; &quot;Wahoo: &quot; &lt;&lt; width &lt;&lt; &quot;,&quot; &lt;&lt; height &lt;&lt; std::endl;

    }
</code></pre>
<p>Ich fand es dann auch recht logisch export &quot;C&quot; den Funktionsdefinitionen voranzustellen - hier kommt es ja schliesslich drauf an, nur gab es dann die Fehlermeldung:</p>
<pre><code>RenderDevice.cc:14: error: declaration of C function `void Java_Renderer_RenderDevice_createDisplay(JNIEnv*, _jobject*, jint, jint, jboolean)' conflicts with

../RenderDevice.h:16: error: previous declaration `void Java_Renderer_RenderDevice_createDisplay(JNIEnv*, _jclass*, jint, jint, jboolean)' here
</code></pre>
<p>Angeblich sind die Deklarationen verschieden... es sind aber beide mit extern &quot;C&quot; definiert - also gleich.</p>
<p>Wenn ich nun das extern &quot;C&quot; aus den headern streiche, klappt alles korrekt.<br />
Also alles kein Problem - es läuft, nur<br />
1.) Verstehe ich das nicht<br />
2.) Muss ich jedesmal das extern &quot;C&quot; streichen, wenn die header neu generiert werden ? Es wäre ja seltsam, wenn Suns header generell nicht funktionieren würde.</p>
<p>Ist das ein Nichtstandart-Verhalten von MinGW ? Oder gibt es eine Lösung ohne die Header zu verändern ?</p>
<p>Ich hoffe jemand von euch kann da etwas Licht reinbringen,<br />
Danke!!!<br />
Frederick</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194919/das-verhalten-von-extern-quot-c-quot</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 19:22:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194919.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Oct 2007 03:42:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Das Verhalten von extern &amp;quot;C&amp;quot; on Fri, 12 Oct 2007 03:42:47 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade mehrere Stunden daran gesessen, den MinGW g++ compiler C-kompatible Symbole erzeugen zu lassen.</p>
<p>Das C++ Mangling Verhalten gewöhnt man ja dem Compiler mit extern &quot;C&quot; ab. Der MinGW zeigt da einen für meinen Geschmack etwas seltsames Verhalten:</p>
<p>Ich habe mit Java´s JNI gebastelt, und da ist das ja so, dass einem die C Header autogeneriert werden.</p>
<p>Java erzeugt mit so etwas, wichtig ist hier eigentlich nur dass &quot;extern&quot;.</p>
<pre><code class="language-cpp">#ifdef __cplusplus
extern &quot;C&quot; {
#endif
/*
 * Class:     Renderer_RenderDevice
 * Method:    createDisplay
 * Signature: (IIZ)V
 */
JNIEXPORT void JNICALL Java_Renderer_RenderDevice_createDisplay
  (JNIEnv *, jclass, jint, jint, jboolean);

/*
 * Class:     Renderer_RenderDevice
 * Method:    setTitle
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_Renderer_RenderDevice_setTitle
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
</code></pre>
<p>Wenn ich nun auf diese Weise eine Implementierung angebe, erzeugt der MinGW trotzdem falsche Symbole. (Immer noch C++)</p>
<pre><code class="language-cpp">JNIEXPORT void JNICALL Java_Renderer_RenderDevice_createDisplay
            (JNIEnv* env, jobject o, jint width, jint height, jboolean fullscreen) {

        std::cout &lt;&lt; &quot;Wahoo: &quot; &lt;&lt; width &lt;&lt; &quot;,&quot; &lt;&lt; height &lt;&lt; std::endl;

    }
</code></pre>
<p>Ich fand es dann auch recht logisch export &quot;C&quot; den Funktionsdefinitionen voranzustellen - hier kommt es ja schliesslich drauf an, nur gab es dann die Fehlermeldung:</p>
<pre><code>RenderDevice.cc:14: error: declaration of C function `void Java_Renderer_RenderDevice_createDisplay(JNIEnv*, _jobject*, jint, jint, jboolean)' conflicts with

../RenderDevice.h:16: error: previous declaration `void Java_Renderer_RenderDevice_createDisplay(JNIEnv*, _jclass*, jint, jint, jboolean)' here
</code></pre>
<p>Angeblich sind die Deklarationen verschieden... es sind aber beide mit extern &quot;C&quot; definiert - also gleich.</p>
<p>Wenn ich nun das extern &quot;C&quot; aus den headern streiche, klappt alles korrekt.<br />
Also alles kein Problem - es läuft, nur<br />
1.) Verstehe ich das nicht<br />
2.) Muss ich jedesmal das extern &quot;C&quot; streichen, wenn die header neu generiert werden ? Es wäre ja seltsam, wenn Suns header generell nicht funktionieren würde.</p>
<p>Ist das ein Nichtstandart-Verhalten von MinGW ? Oder gibt es eine Lösung ohne die Header zu verändern ?</p>
<p>Ich hoffe jemand von euch kann da etwas Licht reinbringen,<br />
Danke!!!<br />
Frederick</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1383323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1383323</guid><dc:creator><![CDATA[Frederick]]></dc:creator><pubDate>Fri, 12 Oct 2007 03:42:47 GMT</pubDate></item><item><title><![CDATA[Reply to Das Verhalten von extern &amp;quot;C&amp;quot; on Fri, 12 Oct 2007 03:55:17 GMT]]></title><description><![CDATA[<p>kann es sein das die typen</p>
<p><a href="http://RenderDevice.cc:14" rel="nofollow">RenderDevice.cc:14</a>: error: declaration of C function `void Java_Renderer_RenderDevice_createDisplay(JNIEnv*, <strong>_jobject</strong>*, jint, jint, jboolean)' conflicts with</p>
<p>../RenderDevice.h:16: error: previous declaration `void Java_Renderer_RenderDevice_createDisplay(JNIEnv*, <strong>_jclass</strong>*, jint, jint, jboolean)' here</p>
<p>unteschiedlich sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1383324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1383324</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Fri, 12 Oct 2007 03:55:17 GMT</pubDate></item><item><title><![CDATA[Reply to Das Verhalten von extern &amp;quot;C&amp;quot; on Fri, 12 Oct 2007 05:47:10 GMT]]></title><description><![CDATA[<p>hab letzt mit mingw ne jni lib bauen wollen und trotz linker options wie --kill-at konnt ich ihn nicht dazu bewegen, die symbole rauszukicken. hab mir dann beholfen, indem ich JNICALL rausgeschmissen hab und __declspec(dllexport) verwendete.</p>
<p>achso, und ja, die beiden methoden werden dieselbe signatur haben, wenn du die dekorationen streichst. vielleicht ists in deinem fall dann besser, nen mapping zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1383340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1383340</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Fri, 12 Oct 2007 05:47:10 GMT</pubDate></item><item><title><![CDATA[Reply to Das Verhalten von extern &amp;quot;C&amp;quot; on Fri, 12 Oct 2007 14:13:13 GMT]]></title><description><![CDATA[<blockquote>
<p>kann es sein das die typen<br />
...<br />
unteschiedlich sind?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Oh nein - wie dämlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Booar es war einfach zu spät gestern nacht. - Läuft jetzt alles prima.<br />
Keine Ahnung wie der Fehler da reingerutscht ist... ich hab ja Cut`n´Paste<br />
aus dem Header gemacht.</p>
<blockquote>
<p>hab letzt mit mingw ne jni lib bauen wollen und trotz linker options wie --kill-at konnt ich ihn nicht dazu bewegen, die symbole rauszukicken</p>
</blockquote>
<p>Das einzige was --kill-at macht ist ein @n von den Symbolen zu entfernen, wobei<br />
n eine Zahl ist, die angibt wieviel Speicher die Funktion auf dem Stack benötigt, das ist aber nur ein Schritt, das C++mangling bekommst dadurch nicht weg. Schau dir mal <a href="http://wyw.dcweb.cn/stdcall.htm" rel="nofollow">http://wyw.dcweb.cn/stdcall.htm</a> dazu an, das hat mir ganz gut geholfen.<br />
Bei mir hat es --add-stdcall-alias getan, aber das hast du ja wahrscheinlich auch probiert. Das Mangling verschwindet nur, wenn man die Funktionsdefinitionen in einen extern &quot;C&quot; Block packt. Ist vielleicht das gleiche wie __declspec(dllexport). Probier mal aus - bei mir klappt das so.<br />
Achja und ich verwende noch -D_JNI_IMPLEMENTATION. Hab aber keine Ahnung was das tut.</p>
<p>Jippey - jetzt klappt endlich alles.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1383820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1383820</guid><dc:creator><![CDATA[Frederick]]></dc:creator><pubDate>Fri, 12 Oct 2007 14:13:13 GMT</pubDate></item></channel></rss>