<?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[Ist es möglich, Code in einer Bibliothek beim Laden auszuführen?]]></title><description><![CDATA[<p>Ich hab für das Programm R eine eigene Bibliothek (in C++) geschrieben. Wenn in der Bibliothek die Standardausgabe benutzt wird, stürzt beim Ausführen des entsprechenden Codes R ab. Um trotzdem cout verwenden zu können, setze ich den Streambuffer entsprechend um, sodass die Ausgabe nach Rprintf() gesendet wird (die Ausgabe-Funktion von R).</p>
<p>Nun mein Problem: Ich möchte, dass sofort bei Laden der Bibliothek (oder sobald das erste mal eine Funktion aus der Bibliothek aufgerufen wird) der folgende Code ausgeführt wird:</p>
<pre><code>Rprintf_buf sb_Rprintf;
std::cout.rdbuf( &amp;sb_Rprintf );
</code></pre>
<p>Dieser Code steht momentan nicht in irgendeiner Funktion, sondern in der &quot;obersten&quot; Ebene. Beim Kompilieren kommt deshalb der Fehler:</p>
<pre><code>RInterface.cpp:23:1: error: 'cout' in namespace 'std' does not name a type make: *** [RInterface.o] Error 1
</code></pre>
<p>Was gibt es da für Lösungsmöglichkeiten?</p>
<p>Mir fällt gerade eigentlich nur ein, bei jedem Funktionsaufruf zu überprüfen, ob der Streambuffer schon umgesetzt wurde (mit einer globalen bool-Variable) und falls nein, den Streambuffer entpsrechend umzusetzen. Wenn die Bilbiothek viele Funktionen hat, die man von außen aufrufen kann, ist das aber irgendwie recht unschön.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310427/ist-es-möglich-code-in-einer-bibliothek-beim-laden-auszuführen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 17:34:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310427.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Nov 2012 14:57:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ist es möglich, Code in einer Bibliothek beim Laden auszuführen? on Sun, 11 Nov 2012 14:57:41 GMT]]></title><description><![CDATA[<p>Ich hab für das Programm R eine eigene Bibliothek (in C++) geschrieben. Wenn in der Bibliothek die Standardausgabe benutzt wird, stürzt beim Ausführen des entsprechenden Codes R ab. Um trotzdem cout verwenden zu können, setze ich den Streambuffer entsprechend um, sodass die Ausgabe nach Rprintf() gesendet wird (die Ausgabe-Funktion von R).</p>
<p>Nun mein Problem: Ich möchte, dass sofort bei Laden der Bibliothek (oder sobald das erste mal eine Funktion aus der Bibliothek aufgerufen wird) der folgende Code ausgeführt wird:</p>
<pre><code>Rprintf_buf sb_Rprintf;
std::cout.rdbuf( &amp;sb_Rprintf );
</code></pre>
<p>Dieser Code steht momentan nicht in irgendeiner Funktion, sondern in der &quot;obersten&quot; Ebene. Beim Kompilieren kommt deshalb der Fehler:</p>
<pre><code>RInterface.cpp:23:1: error: 'cout' in namespace 'std' does not name a type make: *** [RInterface.o] Error 1
</code></pre>
<p>Was gibt es da für Lösungsmöglichkeiten?</p>
<p>Mir fällt gerade eigentlich nur ein, bei jedem Funktionsaufruf zu überprüfen, ob der Streambuffer schon umgesetzt wurde (mit einer globalen bool-Variable) und falls nein, den Streambuffer entpsrechend umzusetzen. Wenn die Bilbiothek viele Funktionen hat, die man von außen aufrufen kann, ist das aber irgendwie recht unschön.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269827</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 11 Nov 2012 14:57:41 GMT</pubDate></item><item><title><![CDATA[Reply to Ist es möglich, Code in einer Bibliothek beim Laden auszuführen? on Sun, 11 Nov 2012 15:26:35 GMT]]></title><description><![CDATA[<p>Ist es eine statische oder eine dynamische Bibliothek?<br />
Bei einer dynamischen solltest du das in der <code>DllMain</code> machen.</p>
<blockquote>
<p>Dieser Code steht momentan nicht in irgendeiner Funktion, sondern in der &quot;obersten&quot; Ebene.</p>
</blockquote>
<p>Entweder war das wirklich ein verzweifelter Versuch, oder dir fehlen Grundlagen, denn das klingt, als ob du einfach einen Funktionsaufruf in den globalen Namensraum geschrieben hättest.</p>
<p>Abgesehen klingt das ganz danach, als ob dein Design nicht so das wahre wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269842</guid><dc:creator><![CDATA[Der Tobi]]></dc:creator><pubDate>Sun, 11 Nov 2012 15:26:35 GMT</pubDate></item><item><title><![CDATA[Reply to Ist es möglich, Code in einer Bibliothek beim Laden auszuführen? on Sun, 11 Nov 2012 17:28:31 GMT]]></title><description><![CDATA[<p>mh, was du machen könntest, was aber dreckig ist:<br />
erstell dir eine globale variable und weise ihr die rückgabe einer funktion zu, in der funktion machst du deine änderungen</p>
<pre><code class="language-cpp">namespace {
    bool foo() {
        Rprintf_buf sb_Rprintf; // wobei das hier böse wird, da referenz auf lokale variable
        std::cout.rdbuf( &amp;sb_Rprintf );
    }
    bool dummy = foo();
};

int main()
{
    return 0x0;
}
</code></pre>
<p>ist aber alles böse. hab ich einmal z debugging zwecken gemacht/gebraucht um einen breakpoint in die speicherallokation zu setzen, um eine speicherleck zu finden, was von SFML erzeugt wurde in eienr globalen variable</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269888</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 11 Nov 2012 17:28:31 GMT</pubDate></item><item><title><![CDATA[Reply to Ist es möglich, Code in einer Bibliothek beim Laden auszuführen? on Sun, 11 Nov 2012 18:08:38 GMT]]></title><description><![CDATA[<p>Die Bibliothek ist dynamsich.<br />
Mit der DllMain hört sich erstmal gut an. Wird die nur dann ausgeführt, wenn man die Bibliothek für Windows kompiliert oder auch bei anderen Betriebssystemen?</p>
<p>Der Tobi schrieb:</p>
<blockquote>
<p>Entweder war das wirklich ein verzweifelter Versuch, oder dir fehlen Grundlagen, denn das klingt, als ob du einfach einen Funktionsaufruf in den globalen Namensraum geschrieben hättest.</p>
</blockquote>
<p>Wahrscheinlich ist es eine Mischung aus beidem. Was hat es genau mit den Namensräumen auf sich?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18806">@Skym0sh0</a>:<br />
Dann müsste aber &quot;Rprintf_buf sb_Rprintf;&quot; außerhalb der foo()-Funktion, weil sonst müsste das Objekt eigentlich weg sein, nachdem foo() verlassen wurde.</p>
<p>Generell kam mir noch die Idee, &quot;std::cout.rdbuf( &amp;sb_Rprintf );&quot; in einen Konstruktur zu packen, den ich durch Deklaration einer globalen Variablen ausführen lasse. Das hat aber Ähnlichkeit mit der foo()-Variante</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269910</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 11 Nov 2012 18:08:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ist es möglich, Code in einer Bibliothek beim Laden auszuführen? on Sun, 11 Nov 2012 18:47:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Wird die nur dann ausgeführt, wenn man die Bibliothek für Windows kompiliert oder auch bei anderen Betriebssystemen?</p>
</blockquote>
<p>Die wird dann ausgeführt, wenn du die DLL an einen Prozess attachst, also z.B. per LoadLibrary in den Prozessspeicher lädtst. (zumindest bei Windows, inwieweit es sowas bei Linux/Mac gibt weiß ich nicht)</p>
<blockquote>
<p>Wahrscheinlich ist es eine Mischung aus beidem. Was hat es genau mit den Namensräumen auf sich?</p>
</blockquote>
<p>Mit welchem Buch/Prof lernst du, dass der/das die Erstellung einer DLL vor den Namensräumen bespricht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269935</guid><dc:creator><![CDATA[Der Tobi]]></dc:creator><pubDate>Sun, 11 Nov 2012 18:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to Ist es möglich, Code in einer Bibliothek beim Laden auszuführen? on Sun, 11 Nov 2012 19:50:55 GMT]]></title><description><![CDATA[<p>Thinking in C++</p>
<p>Die DllMain wird nirendwo erwähnt. Ein wenig googlen ergibt, dass es wohl nur für Windows ist. Linux benutzt &quot;void my_load(void)&quot;. Und Mac dann wahrscheinlich noch was anderes. Schön ist das nicht.</p>
<p>Zu namespaces in Bezug auf eigene Bibliotheken finde ich in dem Buch leider nichts. Über namespaces allgemein natürlich schon, aber auch nicht so wirklich viel.</p>
<p>Edit:<br />
Ich hab es jetzt mit meiner Konstruktor-Idee gelöst. Es funktioniert, d.h. man kann es kompilieren, es tut, was es soll, und R stürzt nicht ab. Hier der Code:</p>
<p>RInterface.h</p>
<pre><code class="language-cpp">class Rprintf_buf : public std::streambuf {
protected:
	virtual int_type overflow( traits_type::int_type m = traits_type::eof()) {
		if( !traits_type::eq_int_type( m, traits_type::eof() ) )
			Rprintf( &quot;%c&quot;, traits_type::to_char_type( m ) ); // genau ein Zeichen auf Rprintf ausgeben
		return traits_type::not_eof( m ); // Ok
	}
};
class SetRprintf_buf {
public:
	SetRprintf_buf();
};
</code></pre>
<p>RInterface.cpp</p>
<pre><code class="language-cpp">Rprintf_buf sb_Rprintf;
SetRprintf_buf::SetRprintf_buf() {
	std::cout.rdbuf( &amp;sb_Rprintf );
}
SetRprintf_buf sb_Rprintf_set;
</code></pre>
<p>Ich hab aber noch ein paar konkrete Fragen zu Namespaces.<br />
- Welche Funktionen sollten in einem Namespace stehen? Alle oder nur die, die nicht von außen aufrufbar sein sollen? (außen = ein Programm, das die Bibliothek benutzt)<br />
- Es gibt Namespaces ohne Namen. Sind die enthaltenen Funktionen nur in der entsprechenden .h/.cpp benutzbar und nicht von anderen Dateien aus?<br />
- Die Funktionen, die von R aus aufrufbar sind, stehen bei mir in einem &quot;extern &quot;C&quot;&quot;-Block. Sind die anderen Funktionen gar nicht aufrufbar oder müsste man wissen, wie der Compiler/Linker die Funktionen umbenannt hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269957</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 11 Nov 2012 19:50:55 GMT</pubDate></item><item><title><![CDATA[Reply to Ist es möglich, Code in einer Bibliothek beim Laden auszuführen? on Sun, 11 Nov 2012 19:53:55 GMT]]></title><description><![CDATA[<p>Schreib doch einfach deine eigene main-Funktion und ruf sie beim laden auf...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269968</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sun, 11 Nov 2012 19:53:55 GMT</pubDate></item><item><title><![CDATA[Reply to Ist es möglich, Code in einer Bibliothek beim Laden auszuführen? on Sun, 11 Nov 2012 20:03:09 GMT]]></title><description><![CDATA[<p>Die normale main()-Funktion wird nicht beim Laden einer Bibliothek ausgeführt.<br />
Und wenn die Bibliothek von R aus geladen wird, habe ich keinen Einfluss darauf, eine bestimmte Funktion auszuführen. Das muss schon automatisch geschehen.</p>
<p>In R kann man in einer Konsole Befehle eingeben. Das sieht z.B. so aus:</p>
<pre><code>library(ls2mat) // Laden meiner Bibliothek (namens ls2mat)
mat &lt;- matrix(1:9, 3, 3) // Matrix zum Testen erstellen
.Call(&quot;outtest2_&quot;, mat) // Aufruf meiner Funktion &quot;outtest2_&quot; mit dem Parameter mat
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2269971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269971</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 11 Nov 2012 20:03:09 GMT</pubDate></item></channel></rss>