<?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 -&amp;gt; undefined reference]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bin recht neu in der Linuxwelt und kämpfe mich so eingermaßen durch,<br />
meine aber die Kompilierschritte und das Linken halbwegs verstanden zu haben.</p>
<p>Nun komme ich aber nicht weiter und bin für jeden Hinweis dankbar...</p>
<p>Ich habe folgende Klasse BodyForce nur auf den Konstruktor reduziert.</p>
<p><strong>body_force.hpp:</strong></p>
<pre><code class="language-cpp">// ********** includes **********
#include&lt;base/function.h&gt;

namespace ares
{
    namespace boundaries
    {   
        template &lt;int dim&gt;
        class BodyForce : public dealii::Function&lt;dim&gt;
        {
            public:
                // ***** constructors ****
                BodyForce();    
        }; // class BodyForce

    } // namespace boundaries

} // namespace ares
</code></pre>
<p><strong>body_force.cpp:</strong></p>
<pre><code class="language-cpp">// ********** includes **********
#include&lt;boundaries/body_force.hpp&gt;

// ********** using declarations **********
using namespace ares;
using namespace boundaries;
using namespace dealii;

template&lt;int dim&gt;
BodyForce&lt;dim&gt;::BodyForce()
                    :
                    Function&lt;dim&gt; (dim)
{
} // constructor
</code></pre>
<p>und es soll nur der Konstruktor getestet werden<br />
<strong>test_body_force.cpp:</strong></p>
<pre><code class="language-cpp">// ********** includes **********
#include &lt;boundaries/body_force.hpp&gt;

// ********** using declarations **********
using namespace ares;
using namespace boundaries;

int main()
{
    const int dim = 2;
    BodyForce&lt;dim&gt; aBodyForce;

    return 0;
}
</code></pre>
<p>So eigentlich nix wildes, nun kompliere ich mit</p>
<pre><code>g++ -c test_body_force.cpp body_force.cpp -I../../include -I/cluster/deal/deal.II/base/include
</code></pre>
<p>und es kommt keine Fehlermeldung</p>
<p>Wenn ich dann aber linken will mit</p>
<pre><code>g++ -o test.out test_body_force.o body_force.o -L/cluster/deal/deal.II/lib -lbase.g
</code></pre>
<p>kommt folgende Fehlermeldung</p>
<pre><code>test_body_force.o: In function `main':
test_body_force.cpp:(.text+0x15): undefined reference to `ares::boundaries::BodyForce&lt;2&gt;::BodyForce()'
collect2: ld returned 1 exit status
</code></pre>
<p>und das checke ich nicht, denn ich hab ja body_force.o erstellt und auch an den Linker übergeben, warum findet der dann nicht den zugehörigen Konstruktor...</p>
<p>Daher bin ich für jede Idee dankbar</p>
<p>Gruß<br />
Rahul</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272613/linker-gt-undefined-reference</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 17:37:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272613.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 Aug 2010 11:13:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Linker -&amp;gt; undefined reference on Sat, 21 Aug 2010 11:13:14 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bin recht neu in der Linuxwelt und kämpfe mich so eingermaßen durch,<br />
meine aber die Kompilierschritte und das Linken halbwegs verstanden zu haben.</p>
<p>Nun komme ich aber nicht weiter und bin für jeden Hinweis dankbar...</p>
<p>Ich habe folgende Klasse BodyForce nur auf den Konstruktor reduziert.</p>
<p><strong>body_force.hpp:</strong></p>
<pre><code class="language-cpp">// ********** includes **********
#include&lt;base/function.h&gt;

namespace ares
{
    namespace boundaries
    {   
        template &lt;int dim&gt;
        class BodyForce : public dealii::Function&lt;dim&gt;
        {
            public:
                // ***** constructors ****
                BodyForce();    
        }; // class BodyForce

    } // namespace boundaries

} // namespace ares
</code></pre>
<p><strong>body_force.cpp:</strong></p>
<pre><code class="language-cpp">// ********** includes **********
#include&lt;boundaries/body_force.hpp&gt;

// ********** using declarations **********
using namespace ares;
using namespace boundaries;
using namespace dealii;

template&lt;int dim&gt;
BodyForce&lt;dim&gt;::BodyForce()
                    :
                    Function&lt;dim&gt; (dim)
{
} // constructor
</code></pre>
<p>und es soll nur der Konstruktor getestet werden<br />
<strong>test_body_force.cpp:</strong></p>
<pre><code class="language-cpp">// ********** includes **********
#include &lt;boundaries/body_force.hpp&gt;

// ********** using declarations **********
using namespace ares;
using namespace boundaries;

int main()
{
    const int dim = 2;
    BodyForce&lt;dim&gt; aBodyForce;

    return 0;
}
</code></pre>
<p>So eigentlich nix wildes, nun kompliere ich mit</p>
<pre><code>g++ -c test_body_force.cpp body_force.cpp -I../../include -I/cluster/deal/deal.II/base/include
</code></pre>
<p>und es kommt keine Fehlermeldung</p>
<p>Wenn ich dann aber linken will mit</p>
<pre><code>g++ -o test.out test_body_force.o body_force.o -L/cluster/deal/deal.II/lib -lbase.g
</code></pre>
<p>kommt folgende Fehlermeldung</p>
<pre><code>test_body_force.o: In function `main':
test_body_force.cpp:(.text+0x15): undefined reference to `ares::boundaries::BodyForce&lt;2&gt;::BodyForce()'
collect2: ld returned 1 exit status
</code></pre>
<p>und das checke ich nicht, denn ich hab ja body_force.o erstellt und auch an den Linker übergeben, warum findet der dann nicht den zugehörigen Konstruktor...</p>
<p>Daher bin ich für jede Idee dankbar</p>
<p>Gruß<br />
Rahul</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942707</guid><dc:creator><![CDATA[Rahul0891]]></dc:creator><pubDate>Sat, 21 Aug 2010 11:13:14 GMT</pubDate></item><item><title><![CDATA[Reply to Linker -&amp;gt; undefined reference on Sat, 21 Aug 2010 11:28:49 GMT]]></title><description><![CDATA[<p>BodyForce ist keine Klasse, sondern eine Klassenvorlage. Die Vorlage muss dem Compiler vollständig bekannt sein, um nach Bedarf Klassen daraus konkretisieren zu können - das heißt, du kannst sie nicht wie eine Klasse in Header- und Quelldatei aufspalten.</p>
<p>Pack die Definition des Konstruktors auch in den Header, und das Problem sollte verschwinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942712</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 21 Aug 2010 11:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to Linker -&amp;gt; undefined reference on Sun, 22 Aug 2010 12:59:10 GMT]]></title><description><![CDATA[<p>Danke für den Hinweis,<br />
das kommt davon, wenn man Templates zwar oft genutzt,<br />
aber so gut wie nicht selbst programmiert hat...</p>
<p>Allerdings möchte ich ungern alles in eine Header-Datei<br />
(empfinde ich als unschönen Stil) packen.</p>
<p>Nach ein wenig Googlen finde ich auch andere Wege,<br />
insbesondere als Stichworte:<br />
-Modell der einschließenden Kompilierung<br />
-Modell der getrennten Kompilierung</p>
<p>Was ich aber nicht so genau gefunden habe,<br />
ist den Nachteil der getrennten Kompilierung...</p>
<p>Der Nachteil der einschließenden Kompilierung war der eventuell<br />
unnötiger mehrfacher Instanzierung bei bestimmten Compilern.</p>
<p>Hat dazu jemand eine Antwort.</p>
<p>Vielen Dank<br />
Rahul</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942973</guid><dc:creator><![CDATA[Rahul0891]]></dc:creator><pubDate>Sun, 22 Aug 2010 12:59:10 GMT</pubDate></item></channel></rss>