2016-06-13 16 views
0

Ich habe 3 Dateien; main.cpp (enthält main()), FileWriter.h und FileWriter.cpp. Ich benutze g ++ (Version Debian 4.9.2-10) auf Debian Jessie. Mein Projekt enthält .cpp-Dateien in '/ root/dev/Practice/src /' und einen einzelnen Header (FileWriter.h) in '/ root/dev/Practice/include /'. Die Kompilation der beiden Objektdateien funktioniert, aber die Verknüpfung mit einer ausführbaren Datei beschwert sich über undefinierte Referenz auf main(), obwohl ich tatsächlich eine scheinbar gültige in main.cpp definiert habe.g ++ Link-Fehler: 'undefinierter Verweis auf' Haupt '

Hier ist die Ausgabe von meinem Make-Datei (die in der Wurzel '/ root/dev/Praxis /' Verzeichnis):

g++ -c -g -Wall -o src/FileWriter.o src/FileWriter.cpp 
g++ -c -g -Wall -o src/main.o src/FileWriter.cpp 
g++ src/FileWriter.o src/main.o -o bin/Practice 
/usr/lib/gcc/i586-linux-gnu/4.9/../../../i386-linux-gnu/crt1.o: In function '_start'" 
/build/glibc-J1NNmk/glibc-2.19/csu/../sysdeps/i386/start.S:111: undefined reference to 'main' 
collect2: error: ls returned 1 exit status 
Makefile:10: recipe for target 'bin/Practice' failed 

Hier ist der Inhalt meiner main.cpp-Datei:

#include <string> 
#include <iostream> 
#include "/root/dev/Practice/include/FileWriter.h" 

int main() { 
    std::cout << "Hello!" << std::endl; 
    FileWriter * fw = new FileWriter("foofile"); 
    fw->AddLine("CRAP!"); 
    fw->AddLine("NO!"); 
    return 0; 
} 

Mein FileWriter.h:

#ifndef FILEWRITER_H_ 
#define FILEWRITER_H_ 

#include <string> 
#include <iostream> 

class FileWriter{ 
public: 
    FileWriter(std::string); 
    ~FileWriter(); 

    void AddLine(std::string); 

private: 
    std::string fileLocation; 
    std::ofstream *filestream; 
}; 

#endif /* FILEWRITER_H_ */ 

... und meine FileWriter.cpp:

#include "/root/dev/Practice/include/FileWriter.h" 
#include <fstream> 

// g++ linker error if 'inline' not included - why? 
inline FileWriter::FileWriter(std::string fileName) 
{ 
    this->fileLocation = fileName; 
    const char * x = this->fileLocation.c_str(); 
    this->filestream = new std::ofstream(); 
    this->filestream->open(x, std::ios::out | std::ios::app); 
} 

inline FileWriter::~FileWriter() 
{ 
    this->filestream->close(); 
} 

inline void FileWriter::AddLine(std::string line) 
{ 
    *this->filestream << line << std::endl; 
} 
+0

Warum das Fluchen? Es kann frustrierend sein, aber bitte unterlassen Sie es in öffentlichen Posts – Li357

+0

@AndrewL Er bereitete diese Worte vor, um zu sagen, wenn er erkennt, was das Problem ist ... –

+0

Das ist besser: ^) – Li357

Antwort

2

Diese Zeile:

g++ -c -g -Wall -o src/main.o src/FileWriter.cpp 

sollte sein:

g++ -c -g -Wall -o src/main.o src/main.cpp 
+0

Gut entdeckt! Das ist genau das Problem ... –

+0

Warum hatte ich das Gefühl, dass es so offensichtlich war? Vielen Dank! Dies führt jedoch zu einem anderen 3 - Fehler 'undefinierter Verweis auf' FileWriter :: FileWriter ... 'für die 3 Zeilen in main.cpp, die auf meine FileWriter - Klasse verweisen. Soll ich das separat fragen? – ErikJL

+1

@ErikJL: Diese Fehler sind auf die 'inline's in FileWriter.cpp, was bedeutet, dass diese Definitionen nur für diese Kompilierungseinheit sichtbar sind.Sie benötigen irgendwo eine Nicht-Inline-Definition oder eine Inline-Definition in einer von' main.cpp' eingeschlossenen Überschrift. –

0

ich haben keinen Zugang zu diesem Compiler haben, aber in der Vergangenheit, wenn Sie main() in einem C++ hatte man es mit __cdecl

int __cdecl main() { 

, die versuchen, zu „dekorieren“ Datei benötigt? Oder:

extern "C" int main() { 
+0

syntastic hat sich über diese Änderung beschwert , es kompiliert immer noch zu main.o, aber die Verknüpfung hatte immer noch den gleichen Fehler. – ErikJL

+0

Wenn alle Quelldateien C++ sind und der C++ - Linker verwendet wird, gelten keine dieser Bedenken. Wenn Sie vorsichtig sein müssen, ist 'main()' mit C-Compiler kompiliert und auch mit C++ - Code verknüpft –