Seite 1 von 1

Unused symbol(s) Linker Error in simpelstem C++

Verfasst: 11. November 2010 13:13
von popeye123
Hallo Leute,
ich weiß grad überhaupt nicht mehr woran es liegen könnte... Ich benutze QtCreator als reine C++ IDE ohne Qt auf OS X Snow Leopard. Also Qt ist schon installiert, jedoch binde ich die Bibliotheken nicht in den Quelltext ein.
Dort gibt der Linker folgende Fehlermeldung aus:

Code: Alles auswählen

:: warning: directory '/tmp/qt-stuff-6474/source/qt-everywhere-opensource-src-4.7.0/lib' following -L not found
:: warning: directory '/tmp/qt-stuff-6474/source/qt-everywhere-opensource-src-4.7.0/lib' following -F not found
:: error: symbol(s) not found
:: error: collect2: ld returned 1 exit status
g++ kompiliert jedoch ohne Probleme.

Leider kann man anscheinend in Codeblöcken keine Textformatierungen machen, deswegen poste ich den Code ausnahmsweise außerhalb von Codeblöcken.

Hier sind Codevarianten, die den Fehler auswerfen, die Änderungen sind jeweils rot markiert.

Die fehlerhafte Methode wird so aufgerufen:

Code: Alles auswählen

int main()
{
    //...
    JFile f;
    // filestream in f wurde im Konstruktor initialisiert
    f.reads (40);
    return 0;
}
///////////////////////////////////////////////////////////////////
class JFile
{
//...
fstream out;
public:
string reads (const int& n,string replaceZeroWith="");
};

string JFile::reads (const int& n,string replaceZeroWith)
{
char* buffer= new char[n];
out.read(buffer,n);
string s;
for (int i=0;i<n;i++)
if (buffer!=0) s+=buffer;
else
s+=replaceZeroWith;
delete [] buffer;
return s;
}
///////////////////////////////////////////////////////////////////

Dieser Code funktioniert jedoch:

///////////////////////////////////////////////////////////////////
class JFile
{
//...
fstream out;
public:
string reads (const int& n /*, string replaceZeroWith*/);
};

string JFile::reads (const int& n/*, string replaceZeroWith*/)
{
char* buffer= new char[n];
out.read(buffer,n);
string s;
for (int i=0;i<n;i++)
if (buffer!=0) s+=buffer;
else
s+="\\0";
delete [] buffer;
return s;
}
///////////////////////////////////////////////////////////////////

Dieser Code funktioniert jedoch auch nicht:

///////////////////////////////////////////////////////////////////
class JFile
{
//...
fstream out;
public:
string reads (const int /*&*/ n);
};

string JFile::reads (const int /*&*/ n)
{
char* buffer= new char[n];
out.read(buffer,n);
string s;
for (int i=0;i<n;i++)
if (buffer!=0) s+=buffer;
else
s+="\\0";
delete [] buffer;
return s;
}

Ich hoffe hier gibt es jemanden, der sich auskennt und helfen kann,
vielen Dank,
Popeye

Verfasst: 11. November 2010 16:09
von solarix
Zum Problem:

1. Ich habe schnell mit CTRL-C/V (und ein paar includes) ein Test gemacht: bei mir Linkt das ganze ohne Probleme

Zum Code:

2. Was versprichst du dir von "const &int"?

3. Was glaubst du erledigt der Konstruktor von "string" bei 'string s="";'

4. Ich kann gerne erklären, was "(*buffer)+='\0';" macht... aber überleg selber nochmals....!

5. Array-Allokationen sollten auch als solche gelöscht werden, also: "delete [] buffer;"

6. Warum dieser konfuse for-Loop? Ist "for (int i=0; i<n;..." nicht wesentlich einfacher?

hth..

Verfasst: 11. November 2010 16:27
von popeye123
1. Ich habe schnell mit CTRL-C/V (und ein paar includes) ein Test gemacht: bei mir Linkt das ganze ohne Probleme
Hm, woran könnte das dann liegen? Ich meine, g++ compiliert ja auch.
2. Was versprichst du dir von "const &int"?
Ich hatte ein ähnliches Problem schon einmal und hatte es dann mit Referenzen in den Griff bekommen. (Warum auch immer) Auch in diesem Fall ändert es etwas: ohne & kommt bei mir auch die Fehlermeldung.
3. Was glaubst du erledigt der Konstruktor von "string" bei 'string s="";'
wahr. vielen dank.
4. Ich kann gerne erklären, was "(*buffer)+='\0';" macht... aber überleg selber nochmals....!
aah, er addiert ne 0?

6. Warum dieser konfuse for-Loop? Ist "for (int i=0; i<n;..." nicht wesentlich einfacher?
Recht hast du, enstand durch Codereduzierung.


Trotz allem sollten diese Punkte doch nichts am Problem ändern?

Verfasst: 11. November 2010 16:33
von popeye123
Hier ist jetzt eine geschönte Fassung:


///////////////////////////////////////////////////////////////////
class JFile
{
//...
fstream out;
public:
string reads (const int& n,string replaceZeroWith="");
};

string JFile::reads (const int& n,string replaceZeroWith)
{
char* buffer= new char[n];
out.read(buffer,n);
string s;
for (int i=0;i<n;i++)
if (buffer!=0) s+=buffer;
else
s+=replaceZeroWith;
delete [] buffer;
return s;
}
///////////////////////////////////////////////////////////////////

Dieser Code funktioniert jedoch:

///////////////////////////////////////////////////////////////////
class JFile
{
//...
fstream out;
public:
string reads (const int& n /*, string replaceZeroWith*/);
};

string JFile::reads (const int& n/*, string replaceZeroWith*/)
{
char* buffer= new char[n];
out.read(buffer,n);
string s;
for (int i=0;i<n;i++)
if (buffer!=0) s+=buffer;
else
s+="\\0";
delete [] buffer;
return s;
}
///////////////////////////////////////////////////////////////////

Dieser Code funktioniert jedoch auch nicht:

///////////////////////////////////////////////////////////////////
class JFile
{
//...
fstream out;
public:
string reads (const int /*&*/ n);
};

string JFile::reads (const int /*&*/ n)
{
char* buffer= new char[n];
out.read(buffer,n);
string s;
for (int i=0;i<n;i++)
if (buffer!=0) s+=buffer;
else
s+="\\0";
delete [] buffer;
return s;
}

Verfasst: 11. November 2010 16:46
von solarix
popeye123 hat geschrieben: aah, er addiert ne 0?
Korrekt... er addiert ne 0 zu einem zufälligen Wert um genau zu sein... :wink:
popeye123 hat geschrieben: Trotz allem sollten diese Punkte doch nichts am Problem ändern?

Ja, das ist so.. ich misstraue ein wenig deiner Installation (schon alleine die Warnung mit diesem "temp"-Verzeichnis spricht gegen eine saubere Creater-Installation).

Um ganz sicher zu gehen: kannst du mal ein minimales Projekt (mit der Klasse, der "main"-Methode und dem "pro"-File) zusammenpacken und hier als Attachment zum Download anhängen?

Verfasst: 11. November 2010 17:10
von popeye123
Ok,
traurig aber wahr: Nachdem ich ein neues Projekt angelegt habe und sonst alles nur kopiert habe, hat er nichts mehr zu meckern.

Oh so ein kack, hab alles ausprobiert,nur nicht das.