...未定义引用... collect2:ld返回1退出状态

时间:2012-08-05 17:41:23

标签: c++ linker ld undefined-reference

我有以下3个文件:

error.h

#ifndef error_h
#define error_h
#include <string>
#include <iostream>
#include <cstdio>
void Error(std::string msg);
#endif

error.cpp

#ifdef error_h
#include "error.h"
void Error(std::string msg)
{
    std::cerr
     << "\n=========================================================\n"
     << msg
     << "\n=========================================================\n";
    exit(EXIT_FAILURE);
}
#endif

foobar.cpp

#include "error.h"
int main()
{
    for(int i=0; i<99; i++)
        if(i==55)
            Error("this works");
    return 0;
}

现在我做了:

$ g++ -c error.cpp foobar.cpp
$ g++ error.o foobar.o -o exampleprogram

我得到了:

foobar.o: In function `main':
foobar.cpp:(.text+0x4b): undefined reference to `Error(std::basic_string<char,
std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status

我做错了什么?在没有提出问题的情况下,我需要了解什么来解决这个问题以及未来的类似问题?谢谢!

3 个答案:

答案 0 :(得分:3)

为什么 error.cpp 中有这些行?

#ifdef error_h
  ...
#endif

由于未定义预处理程序符号error_h,预处理程序将忽略 error.cpp 的全部内容。删除这些行,您的程序将成功链接。

您似乎对如何(以及为什么)使用#include警卫有误解。有关说明,请参阅this答案。

此外,无需在 error.h 中包含 iostream cstdio ,因为该文件未使用任何一个中声明的内容那些标题。这些文件应包含在 error.cpp

答案 1 :(得分:2)

删除此

#ifdef error_h

以及来自#endif的相应error.cpp。否则,在这里:

  

$ g ++ -c error.cpp foobar.cpp

error.cpp基本上是空的。这是因为在那个阶段error_h没有定义。所以你没有编译实现(如果你在<{em> error.h之前加入了#ifdef ,它会有效,但没有理由在.cpp中有这个文件无论如何)。

答案 2 :(得分:2)

error.cpp中未定义

error_h,因此所有文件内容都会被#ifdef&#39; d消失。

实质上,您将error.cpp编译为空文件。