3

私は次の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

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_hが定義されていないため、 error.cppの内容全体がプリプロセッサによって省略されています。これらの行を削除すると、プログラムが正常にリンクされます。

#includeガードの使用方法 (およびおそらく理由) について誤解しているようです。説明については、この回答を参照してください。

また、iostreamcstdioerror.hに含める必要はありません。そのファイルは、これらのヘッダーのいずれかで宣言されたものを使用していないためです。これらのファイルはerror.cppに含める必要があります。

于 2012-08-05T17:47:32.467 に答える
2

これを削除します

#ifdef error_h

および対応する#endiffrom error.cpp。それ以外の場合は、ここで:

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

error.cpp本質的に空です。これは、その段階error_hでは定義されていないためです。error.h したがって、実装をコンパイルしていません(以前にインクルードしていれば機能します#ifdefが、とにかくファイルにそれを含める理由はありませ.cppん)。

于 2012-08-05T17:44:45.483 に答える
2

error_herror.cppで定義されていないため、すべてのファイルコンテンツが#ifdefされます。

本質的には、error.cppを空のファイルとしてコンパイルしていることになります。

于 2012-08-05T17:45:35.743 に答える