2016-06-13 85 views
0

我有3个文件; main.cpp(包含main()),FileWriter.h和FileWriter.cpp。我在Debian Jessie上使用g ++(版本Debian 4.9.2-10)。我的项目包含'/ root/dev/Practice/src /'中的.cpp文件和'/ root/dev/Practice/include /'中的单个头文件(FileWriter.h)。两个目标文件的编译工作,但链接到一个可执行文件抱怨未定义的引用main(),虽然我确实有一个看起来有效的'main.cpp'定义。g ++链接错误:未定义的引用'主'

这是我的make文件的输出(这是在根目录 '/根的/ dev /业务/' 目录):

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 

这是我的main.cpp文件的内容:

#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; 
} 

我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_ */ 

...和我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

为什么骂?这可能令人沮丧,但请不要在公开帖子中这样做。 – Li357

+0

@AndrewL他准备说这些话的时候,他意识到什么时候他意识到问题所在...... –

+0

这样比较好:^) – Li357

回答

2

这条线:

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

应该是:

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

!这正是问题所在...... –

+0

为什么我有一种明显的感觉?谢谢!然而,这会导致另外3个错误'未定义的引用'FileWriter :: FileWriter ...'在main.cpp中的3行引用我的FileWriter类。我应该单独问这个问题吗? – ErikJL

+1

@ErikJL:这些错误是由于'inline'在FileWriter.cpp中,这意味着这些定义只对那个编译单元可见,你需要一个非内联的定义,或者'main.cpp'包含的头文件中的内联定义 –

0

我没有访问该编译器,但在过去,如果你有在C main() ++文件,你需要“装饰”它__cdecl

int __cdecl main() { 

尝试吗?或者:

extern "C" int main() { 
+0

Synthetic抱怨这种变化,它仍然编译为main.o,但链接仍然有相同的错误。 – ErikJL

+0

当所有的源文件都是C++,并且使用C++链接器时,这些问题都不适用。当你必须小心的是,如果'main()'是用C编译器编译的,并且还会链接到C++代码 –

相关问题