【问题标题】:g++ link error: 'undefined reference to 'main'g ++链接错误:'未定义对'main'的引用
【发布时间】:2016-06-13 05:28:54
【问题描述】:

我有 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”中定义了一个看似有效的引用。

这是我的 make 文件的输出(位于根 '/root/dev/Practice/' 目录中):

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

【问题讨论】:

  • 为什么要骂人?这可能会令人沮丧,但请不要在公开帖子中这样做
  • @AndrewL 当他意识到问题所在时,他正在准备要说的话......
  • 哎呀!大声笑对不起。编辑删除。
  • #include "/root/..." 。如果你以 root 身份编译,你就是一个勇敢的人 :)
  • 勇敢,或者只是一个愚蠢的新手,他还没有做过任何坏事让我创建一个用户帐户:)

标签: c++ linker g++ linker-errors


【解决方案1】:

这一行:

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

应该是:

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

【讨论】:

  • 为什么我感觉它那么明显?谢谢!但是,这会导致 main.cpp 中引用我的 FileWriter 类的 3 行的另外 3 个错误“未定义对 'FileWriter::FileWriter...”的引用。我应该单独问这个吗?
  • @ErikJL:这些错误是由于 FileWriter.cpp 中的 inlines 造成的,这意味着这些定义仅对该编译单元可见。您需要在某处使用非内联定义,或 main.cpp 包含的标头中的内联定义。
  • 谢谢你,Chris - 添加 'inline' 感觉不对,但它消除了其他编译​​错误。现在可能出现的错误将通过我希望的其他修复来解决。
【解决方案2】:

我无权访问此编译器,但在过去,如果您在 C++ 文件中有 main(),则需要使用 __cdecl“装饰”它

int __cdecl main() {

试试看?或者:

extern "C" int main() {

【讨论】:

  • syntastic 抱怨了这个变化,它仍然编译到 main.o,但是链接仍然有同样的错误。
  • 当所有源文件都是 C++ 并且使用 C++ 链接器时,这些问题都不适用。需要注意的是,main() 是否使用 C 编译器编译并链接到 C++ 代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 2011-06-03
  • 1970-01-01
  • 2010-12-25
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多