3

我有以下 3 个文件:

错误.h

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

错误.cpp

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

foob​​ar.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

我究竟做错了什么?我需要了解什么来解决这个问题,以及将来不提出问题的类似问题?谢谢!

4

3 回答 3

4

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

#ifdef error_h
  ...
#endif

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

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

此外,没有必要在error.h中包含iostreamcstdio,因为该文件没有使用这些头文件中声明的任何内容。这些文件应包含在error.cpp中。

于 2012-08-05T17:47:32.467 回答
2

删除这个

#ifdef error_h

和相应#endif的 from error.cpp。否则,在这里:

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

error.cpp本质上是空的。这是因为在那个阶段error_h没有定义。所以你没有编译实现(如果你在 之前包含它会起作用,error.h #ifdef无论如何都没有理由在.cpp文件中包含它)。

于 2012-08-05T17:44:45.483 回答
2

error_h未在 error.cpp 中定义,因此您的所有文件内容都会被 #ifdef 删除。

本质上,您将 error.cpp 编译为一个空文件。

于 2012-08-05T17:45:35.743 回答