<?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[dlsym rückgabewert casten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein shared object erstellt, und mittels dlopen geladen. Danach habe ich mit dlsym versucht eine funktion zu laden, die mir einen zeiger auf eine klasse zurückgibt, welche ich mit static_cast zu casten versucht habe.</p>
<p>Wenn ich jetzt versuche, eine methode aus dieser gecasteten classe zu laden, bekomme ich die fehlermeldung &quot;Speicherzugriffsfehler&quot;.</p>
<p>Kann mir jemand sagen, wo ich einen fehler gemacht habe?</p>
<p>Danke!</p>
<p>Hier der source der klasse, welche das plugin lädt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;dlfcn.h&gt;
#include &quot;testplugin/testplugin.h&quot;

int main()
{
	void *handle = dlopen(&quot;libtestplugin.so&quot;, RTLD_NOW);

	if (!handle)
		return 0;

	void *pluginInstance = dlsym(handle, &quot;createClassInstance&quot;);

	if (!pluginInstance)
	{
		dlclose(handle);
		return 0;
	}

	TestPlugin *tp = static_cast&lt;TestPlugin *&gt;(pluginInstance);

	if (tp)
		tp-&gt;printTestMessage();

	dlclose(handle);

	return 0;
}
</code></pre>
<p>Header des plugins:</p>
<pre><code class="language-cpp">#ifndef TESTPLUGIN_H_
#define TESTPLUGIN_H_

class TestPlugin
{
	public:
		TestPlugin();
		virtual ~TestPlugin();

		void printTestMessage();
};

extern &quot;C&quot; TestPlugin *createClassInstance();

#endif /* TESTPLUGIN_H_ */
</code></pre>
<p>Source des Plugins:</p>
<pre><code class="language-cpp">#include &quot;testplugin.h&quot;
#include &lt;iostream&gt;

TestPlugin::TestPlugin()
{

}

void TestPlugin::printTestMessage()
{
	std::cout &lt;&lt; &quot;Plugin geladen!&quot; &lt;&lt; std::endl;
}

TestPlugin::~TestPlugin()
{
}

extern &quot;C&quot; TestPlugin *createClassInstance()
{
	return new TestPlugin;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/301146/dlsym-rückgabewert-casten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 06:37:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301146.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Mar 2012 14:45:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 14:45:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein shared object erstellt, und mittels dlopen geladen. Danach habe ich mit dlsym versucht eine funktion zu laden, die mir einen zeiger auf eine klasse zurückgibt, welche ich mit static_cast zu casten versucht habe.</p>
<p>Wenn ich jetzt versuche, eine methode aus dieser gecasteten classe zu laden, bekomme ich die fehlermeldung &quot;Speicherzugriffsfehler&quot;.</p>
<p>Kann mir jemand sagen, wo ich einen fehler gemacht habe?</p>
<p>Danke!</p>
<p>Hier der source der klasse, welche das plugin lädt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;dlfcn.h&gt;
#include &quot;testplugin/testplugin.h&quot;

int main()
{
	void *handle = dlopen(&quot;libtestplugin.so&quot;, RTLD_NOW);

	if (!handle)
		return 0;

	void *pluginInstance = dlsym(handle, &quot;createClassInstance&quot;);

	if (!pluginInstance)
	{
		dlclose(handle);
		return 0;
	}

	TestPlugin *tp = static_cast&lt;TestPlugin *&gt;(pluginInstance);

	if (tp)
		tp-&gt;printTestMessage();

	dlclose(handle);

	return 0;
}
</code></pre>
<p>Header des plugins:</p>
<pre><code class="language-cpp">#ifndef TESTPLUGIN_H_
#define TESTPLUGIN_H_

class TestPlugin
{
	public:
		TestPlugin();
		virtual ~TestPlugin();

		void printTestMessage();
};

extern &quot;C&quot; TestPlugin *createClassInstance();

#endif /* TESTPLUGIN_H_ */
</code></pre>
<p>Source des Plugins:</p>
<pre><code class="language-cpp">#include &quot;testplugin.h&quot;
#include &lt;iostream&gt;

TestPlugin::TestPlugin()
{

}

void TestPlugin::printTestMessage()
{
	std::cout &lt;&lt; &quot;Plugin geladen!&quot; &lt;&lt; std::endl;
}

TestPlugin::~TestPlugin()
{
}

extern &quot;C&quot; TestPlugin *createClassInstance()
{
	return new TestPlugin;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2193261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193261</guid><dc:creator><![CDATA[Steini79]]></dc:creator><pubDate>Tue, 20 Mar 2012 14:45:29 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 14:48:26 GMT]]></title><description><![CDATA[<p>C++-Objekte über eine Shared Library (=reines C-Interface) zu schieben ist immer eine gute Idee - zumindest wenn man lustige Crashs und undefiniertes Verhalten haben möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193262</guid><dc:creator><![CDATA[Donggger]]></dc:creator><pubDate>Tue, 20 Mar 2012 14:48:26 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 14:50:23 GMT]]></title><description><![CDATA[<p>Wie soll ich sonst ein plugin-system realisieren, wenn ich nur dlopen/dlsym habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193264</guid><dc:creator><![CDATA[Steini79]]></dc:creator><pubDate>Tue, 20 Mar 2012 14:50:23 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 14:56:58 GMT]]></title><description><![CDATA[<p>Das Problem liegt nicht bei dlopen() und dlsym(), die sind vollkommen in Ordnung genau so wie das Konzept der Shared Libraries. Das Problem liegt darin, dass diese nur für den Export von C-Funktionen gedacht sind, du aber C++-Objekte verwendest.</p>
<p>Das KANN gut gehen, muss aber nicht. D.h. unter Umständen funktioniert es, unter Umständen reicht aber auch schon irgend eine Compileroption, die bei Plug-In und Hauptprogramm anders gesetzt ist, um dir die seltsamsten Effekte zu bescheren. Von unterschiedlichen Compilerversionen ganz zu schweigen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193270</guid><dc:creator><![CDATA[Donggger]]></dc:creator><pubDate>Tue, 20 Mar 2012 14:56:58 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 14:59:10 GMT]]></title><description><![CDATA[<p>Donggger schrieb:</p>
<blockquote>
<p>Das Problem liegt darin, dass diese nur für den Export von C-Funktionen gedacht sind, du aber C++-Objekte verwendest.</p>
</blockquote>
<p>Was wäre eine alternative für dlopen, damit das mit c++ objekten funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193273</guid><dc:creator><![CDATA[Steini79]]></dc:creator><pubDate>Tue, 20 Mar 2012 14:59:10 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 15:11:41 GMT]]></title><description><![CDATA[<p>Steini79, hör nicht auf Donggger.</p>
<p>Dein Problem hat eine simple Ursache:<br />
dlsym ruft deine Funktion nicht auf, sondern gibt lediglich einen Funktionszeiger zurück.<br />
Deine &quot;plugInstance&quot; ist also kein Zeiger auf ein Objekt deiner Klasse sondern eben ein Funktionszeiger.</p>
<p>So wäre es also <strong>fast</strong> richtig:</p>
<pre><code class="language-cpp">typedef TestPlugin * (*createClassInstancePtr)();

// ...

createClassInstancePtr createClassInstance = (createClassInstancePtr)dlsym(handle, &quot;createClassInstance&quot;);
TestPlugin * instance = createClassInstance();
</code></pre>
<p><strong>fast</strong>, weil der Standard nicht garantiert, dass ein Funktionszeiger genauso groß ist wie ein Objektzeiger (z.B. void*, int*, TestPlugin* ...).<br />
dlsym stellt eine Inkompatibilität zwischen POSIX und ANSI dar und wurde auch schon mehrfach im Netz diskutiert.</p>
<p>Korrekt wäre also, in dein Shared Object sowas zu packen:</p>
<pre><code class="language-cpp">// für plugin und programm sichtbar
// z.B. in einem Header
struct exported_functions
{
    TestPlugin * (*createClassInstance)();
};

// nur im Plugin
// global!
exported_functions public_interface = 
{
    &amp;createClassInstance // Zeiger auf deine Funktion
};

// und das kommt in das Programm:
exported_functions * functions = static_cast&lt;exported_functions*&gt;(dlsym(handle, &quot;public_interface&quot;));
TestPlugin * instance = functions-&gt;createClassInstance();
</code></pre>
<p>Nur so gehst du dem Problem der Zeigergröße aus dem Weg.</p>
<p>Eventuell musst du die globale Instanz der exported_functions Struktur noch in einen <em>extern &quot;C&quot;</em>-Block stecken, da bin ich mir gerade nicht sicher :p<br />
Einfach ausprobieren, wie es functioniert <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/2193279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193279</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Tue, 20 Mar 2012 15:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 16:27:18 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>Steini79, hör nicht auf Donggger.</p>
<p>Dein Problem hat eine simple Ursache:<br />
dlsym ruft deine Funktion nicht auf, sondern gibt lediglich einen Funktionszeiger zurück.</p>
</blockquote>
<p>Richtig, einen <strong>Funktions</strong>zeiger, kein Objekt. Weil Bibliotheken nun mal nicht für Objekte vorgesehen sind - deswegen hat MS ja das unselige COM/DCOM erfunden.</p>
<p>Und warum genau soll er jetzt nicht auf mich hören? Willst du ihn lieber weiter in die falsche Richtung laufen lassen, bis ihm seine Objekte über die C-Schnittstelle irgendwann viel, viel später um die Ohren fliegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193304</guid><dc:creator><![CDATA[Donggger]]></dc:creator><pubDate>Tue, 20 Mar 2012 16:27:18 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 16:45:33 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10459">@DrakoXP</a></p>
<p>Danke für deine hilfe, ich werde mir das genauer ansehen.</p>
<p>@Donggger</p>
<p>Ich nehme mir beide argumentationen zu herzen, gibt es dann eine alternative zu dlopen/dlsym?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193310</guid><dc:creator><![CDATA[Steini79]]></dc:creator><pubDate>Tue, 20 Mar 2012 16:45:33 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 17:43:18 GMT]]></title><description><![CDATA[<p>Steini79 schrieb:</p>
<blockquote>
<p>Ich nehme mir beide argumentationen zu herzen, gibt es dann eine alternative zu dlopen/dlsym?</p>
</blockquote>
<p>dlopen/dlsym passt schon. Du musst nur dein Interface aendern.</p>
<p>Statt<br />
foo-&gt;bar()<br />
schreibst du ab jetzt<br />
bar(foo);</p>
<p>Sprich: du machst dein Interface einfach Kompatibel zur verwendeten technology. Das bedeutet lustigerweise naemlich auch gleich, dass ich mit so ziemlich jeder Sprache dein shared object nutzen kann, nicht nur mit C++.</p>
<p>Und das ganze ist sowieso nur Syntax um die es geht - die Funktionalitaet bleibt eh gleich.</p>
<p>Das Shared Object exportiert eine create Funktion die einen void* returned. Intern macht sie natuerlich new Foo(), liefert das Foo Objekt aber nur als void* raus. Oft versteckt man den void* hinter einem typedef, damits besser aussieht.</p>
<p>Wenn du nun foo-&gt;bar() aufrufen willst, dann exportiert das shared object eine Funktion bar die einen void* nimmt (als this Zeiger) und so implementiert ist:<br />
static_cast&lt;Foo*&gt;(foo)-&gt;bar();</p>
<p>so hast du auch weiter die komplette polymorphie erhalten die du in deinem C++ Code hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193322</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 20 Mar 2012 17:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Tue, 20 Mar 2012 22:43:42 GMT]]></title><description><![CDATA[<p>Donggger schrieb:</p>
<blockquote>
<p>Das KANN gut gehen, muss aber nicht. D.h. unter Umständen funktioniert es, unter Umständen reicht aber auch schon irgend eine Compileroption, die bei Plug-In und Hauptprogramm anders gesetzt ist, um dir die seltsamsten Effekte zu bescheren. Von unterschiedlichen Compilerversionen ganz zu schweigen...</p>
</blockquote>
<blockquote>
<p>Und warum genau soll er jetzt nicht auf mich hören? Willst du ihn lieber weiter in die falsche Richtung laufen lassen, bis ihm seine Objekte über die C-Schnittstelle irgendwann viel, viel später um die Ohren fliegen?</p>
</blockquote>
<p>Die Berichte von auf Grund von unterschiedlichen Compiler-Switches explodierten Programmen sind stark übertrieben.</p>
<p>Es gibt andere Dinge die schon weniger egal sind, wie z.B. die Sache mit unterschiedlichen CRT Versionen, Heap etc.<br />
Lässt sich aber auch alles regeln.</p>
<p>Es gibt Fälle wo C-Interfaces angesagt sind, und es gibt Fälle wo C++ Interfaces angesagt bzw. zumindest vollkommen OK sind. Die Grundsätzliche &quot;C++ Interfaces sind pöse&quot; Panikmache kann ich nicht ganz nachvollziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193402</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 20 Mar 2012 22:43:42 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 06:34:02 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Die Grundsätzliche &quot;C++ Interfaces sind pöse&quot; Panikmache kann ich nicht ganz nachvollziehen.</p>
</blockquote>
<p>Na dann schreib' mal eine DLL mit Visual Studio die Objekte nutzt. Und viel Spaß dann mit dem Support für deine Kunden, die eine Applikation mit MingW compilieren und denen deine DLL bei jedem Zugriff um die Ohren fliegt.</p>
<p>Oder auch viel Spaß mit denen, die zwar Visual Studio verwenden, aber einen Debug-Build verwenden wollen. Erkläre denen mal, dass du keinen Debug-Build deiner DLL auslieferst und sie deswegen ihre Applikation auch nur als Release-Build debuggen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193427</guid><dc:creator><![CDATA[Donggger]]></dc:creator><pubDate>Wed, 21 Mar 2012 06:34:02 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 11:35:38 GMT]]></title><description><![CDATA[<p>Komm lass gut sein und troll hier nicht rum.<br />
Wenn du diskutieren willst dann zitier ordentlich</p>
<blockquote>
<p><strong>Es gibt Fälle wo C-Interfaces angesagt sind, und es gibt Fälle wo C++ Interfaces angesagt bzw. zumindest vollkommen OK sind.</strong> Die Grundsätzliche &quot;C++ Interfaces sind pöse&quot; Panikmache kann ich nicht ganz nachvollziehen.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2193568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193568</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Mar 2012 11:35:38 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 11:45:32 GMT]]></title><description><![CDATA[<p>Danke an alle für die infos! Das hilft mir weiter.</p>
<p>@Donggger</p>
<p>Der vollständigkeit halber würde ich auch gerne deine argumentation verstehen, dazu müsste ich aber wissen, wie du die sache mit anstatt mit dlopen/dlsym lösen würdest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193578</guid><dc:creator><![CDATA[Steini79]]></dc:creator><pubDate>Wed, 21 Mar 2012 11:45:32 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 14:14:44 GMT]]></title><description><![CDATA[<p>Steini79 schrieb:</p>
<blockquote>
<p>dazu müsste ich aber wissen, wie du die sache mit anstatt mit dlopen/dlsym lösen würdest?</p>
</blockquote>
<p>Den Ersatz für dlopen()/dlsym() den du suchst, gibt es nicht. Wenn es um Shared Libraries geht, kannst du nur diese Funktionen verwenden und du kannst dir nur C-Funktionspointer mit C-Datentypen als Parameter zurückgeben lassen.</p>
<p>Der springende Punkt ist: Shared Libraries sind genau dafür gedacht, für Objekte waren sie nie vorgesehen. Wenn du wirklich Objekte über ausgelagerte Programmkomponenten ziehen willst und eine <strong>saubere</strong> Lösung suchst, darfst du generell keine Shared Library verwenden, sondern müsstest dich beim COM-Interface (nicht zu verwechseln mit der seriellen Schnittstelle) bedienen. Und das gibt es nur bei Windows.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193683</guid><dc:creator><![CDATA[Donggger]]></dc:creator><pubDate>Wed, 21 Mar 2012 14:14:44 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 14:17:46 GMT]]></title><description><![CDATA[<p>Donggger schrieb:</p>
<blockquote>
<p>Wenn du wirklich Objekte über ausgelagerte Programmkomponenten ziehen willst und eine <strong>saubere</strong> Lösung suchst, darfst du generell keine Shared Library verwenden, sondern müsstest dich beim COM-Interface (nicht zu verwechseln mit der seriellen Schnittstelle) bedienen. Und das gibt es nur bei Windows.</p>
</blockquote>
<p>Schwachsinn. Das geht mit dem Posix-Interface wunderbar und wohldefiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193686</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 21 Mar 2012 14:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 17:44:01 GMT]]></title><description><![CDATA[<p>@Donggger<br />
Du verwechselst &quot;sauber&quot; mit &quot;so flexibel wie möglich&quot;.<br />
Es ist nichts unsauberes daran einen Compiler (plus evtl. nötige Einstellungen) vorzuschreiben.<br />
COM funktioniert ja auch nur weil alle (relevanten) Windows-Compiler sich an das &quot;COM kompatible&quot; VTable Layout von MSVC halten.<br />
MS verwendet sogar im Kernel-Mode diverse &quot;virtuelle&quot; Interfaces.</p>
<p>Das selbe kann man auch schön mit GCC unter Linux/BSD/... machen. Wird auch gemacht. Funktioniert auch gut.</p>
<p>Es ist natürlich nicht so flexibel wie ein reines C-Interface, weil es eben gewisse Restrictions bezüglich verwendbarer Compiler etc. bedeutet, aber wie schon gesagt: es ist nichts &quot;unsauberes&quot; daran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193768</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Mar 2012 17:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 17:50:54 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Donggger schrieb:</p>
<blockquote>
<p>Wenn du wirklich Objekte über ausgelagerte Programmkomponenten ziehen willst und eine <strong>saubere</strong> Lösung suchst, darfst du generell keine Shared Library verwenden, sondern müsstest dich beim COM-Interface (nicht zu verwechseln mit der seriellen Schnittstelle) bedienen. Und das gibt es nur bei Windows.</p>
</blockquote>
<p>Schwachsinn. Das geht mit dem Posix-Interface wunderbar und wohldefiniert.</p>
</blockquote>
<p>Welches Posix-Interface meinst du <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2193771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193771</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Mar 2012 17:50:54 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 18:06:59 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Welches Posix-Interface meinst du <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>
</blockquote>
<p>Na das, von dem wir (fast) die ganze Zeit reden: dlopen, dlssym, ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193776</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 21 Mar 2012 18:06:59 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 19:21:30 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Welches Posix-Interface meinst du <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>
</blockquote>
<p>Na das, von dem wir (fast) die ganze Zeit reden: dlopen, dlssym, ...</p>
</blockquote>
<p>Heißt das, unter Windows gibt es keine sichere/saubere/... Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193802</guid><dc:creator><![CDATA[hutzlwutzl]]></dc:creator><pubDate>Wed, 21 Mar 2012 19:21:30 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 19:28:51 GMT]]></title><description><![CDATA[<p>Nö, hab ich das irgendwo geschrieben? -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193803</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 21 Mar 2012 19:28:51 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 19:53:11 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Donggger schrieb:</p>
<blockquote>
<p>Wenn du wirklich Objekte über ausgelagerte Programmkomponenten ziehen willst und eine <strong>saubere</strong> Lösung suchst, darfst du generell keine Shared Library verwenden, sondern müsstest dich beim COM-Interface (nicht zu verwechseln mit der seriellen Schnittstelle) bedienen. Und das gibt es nur bei Windows.</p>
</blockquote>
<p>Schwachsinn. Das geht mit dem Posix-Interface wunderbar und wohldefiniert.</p>
</blockquote>
<p>Nope. Geht leider nicht so einfach. Weil wenn du zB den gcc verwendest und ich den llvm dann tut das ganz dicke aua machen wenn wir versuchen C++ Objekte zu sharen <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>Aber insofern hast du recht, es ist wohldefiniert was passiert: naemlich ein PENG BUMM BAENG.</p>
<p>C++ Objekte ueber Modulgrenzen hinweg sharen ist deshalb doof, weil C++ keine definierte ABI hat. Da gibt es viele Fallstricke deshalb ratet man davon ab.</p>
<p>Wo es Sinn machen kann ist innerhalb eines Projektes - wenn man das Buildenvironment kontrolliert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193812</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 21 Mar 2012 19:53:11 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 20:00:27 GMT]]></title><description><![CDATA[<p>Als alternative kann man ja auch eine Skriptsprache für die Module verwenden, z.B. Python, Lua oder AngelScript</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193817</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 21 Mar 2012 20:00:27 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 20:17:31 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>C++ Objekte ueber Modulgrenzen hinweg sharen ist deshalb doof, weil C++ keine definierte ABI hat. Da gibt es viele Fallstricke deshalb ratet man davon ab.</p>
<p>Wo es Sinn machen kann ist innerhalb eines Projektes - wenn man das Buildenvironment kontrolliert.</p>
</blockquote>
<p>Das Build-Environment kann man auch toll für Plugins kontrollieren. z.B. indem man es vorschreibt, evtl. sogar gleich passende Makefiles/Solution-Files mitliefert.</p>
<p>Ich verstehe einfach nicht wieso manche immer meinen, dass etwas was sie für ihr Projekt nicht brauchen/brauchen können (bzw. einfach nicht *wollen*), auch ganz allgemein eine schlechte Idee sein muss.</p>
<p>Es gibt einige Projekte die recht erfolgreich Plugins mit C++ Schnittstelle verwenden. Als ein Beispiel wäre foobar2000 zu nennen.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Nope. Geht leider nicht so einfach. Weil wenn du zB den gcc verwendest und ich den llvm dann tut das ganz dicke aua machen wenn wir versuchen C++ Objekte zu sharen <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>
</blockquote>
<p>S.o.: nimm halt einfach nicht LLVM sondern das was das Programm vorschreibt. Mir ist vollkommen klar was du meinst, aber gleichzeitig vollkommen unklar wieso das ein <em>generelles</em> Problem sein sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193831</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Mar 2012 20:17:31 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 21:45:57 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Welches Posix-Interface meinst du <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>
</blockquote>
<p>Na das, von dem wir (fast) die ganze Zeit reden: dlopen, dlssym, ...</p>
</blockquote>
<p>dlopen, dlssym etc. tragen jetzt weder besonders viel dazu bei dass es geht, noch arbeiten sie irgendwie dagegen.<br />
Damit kann man halt Zeiger per Namen aus nem SO rausholen, mehr nicht. (EDIT: und das SO vorher erstmal laden natürlich /EDIT)</p>
<p>Ob man problemlos mit C++ Interfaces arbeiten kann oder nicht, wird davon nicht wirklich beeinflusst - da sind andere Dinge wichtig.</p>
<p>Daher dachte ich du meinst vielleicht die Itanium C++ ABI - die aber mit Posix rein gar nix zu tun hat. Weil ich mir aber nicht sicher war, dachte ich mir ich frag lieber mal nach...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193832</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Mar 2012 21:45:57 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 21:42:32 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>S.o.: nimm halt einfach nicht LLVM sondern das was das Programm vorschreibt. Mir ist vollkommen klar was du meinst, aber gleichzeitig vollkommen unklar wieso das ein <em>generelles</em> Problem sein sollte.</p>
</blockquote>
<p>Ein Problem per se ist es nicht. Aber es sind sehr wenige Situationen wo C++ Interfaces hier Sinn machen. Denn C++ Interfaces verlangen, dass man das Build Environment kontrollieren kann. Wenn man das kann, super - dann ists kein Problem.</p>
<p>Nur oft kann man das nicht. Deshalb lieber C++ in Shared Objects mit vorsicht behandeln. Wenn man aber natuerlich weiss was man tut, ists kein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193876</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 21 Mar 2012 21:42:32 GMT</pubDate></item><item><title><![CDATA[Reply to dlsym rückgabewert casten on Wed, 21 Mar 2012 21:54:02 GMT]]></title><description><![CDATA[<p>@Shade<br />
OK, dann sind wir uns ja einig <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>@hutzlwutzl<br />
Unter Windows gibt es DLLs statt Shared Objects und die Funktionen LoadLibrary/GetProcAddress statt dlopen/dlsym.<br />
Wobei Windows DLLs und Linux/... Shared Objects einige Dinge etwas anders regeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193883</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Mar 2012 21:54:02 GMT</pubDate></item></channel></rss>