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

Alles rund um die Programmierung mit Qt
Antworten
popeye123
Beiträge: 4
Registriert: 11. November 2010 12:35

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

Beitrag 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
Zuletzt geändert von popeye123 am 11. November 2010 16:36, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
popeye123
Beiträge: 4
Registriert: 11. November 2010 12:35

Beitrag 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?
popeye123
Beiträge: 4
Registriert: 11. November 2010 12:35

Beitrag 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;
}
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
popeye123
Beiträge: 4
Registriert: 11. November 2010 12:35

Beitrag 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.
Antworten