1

宣言はヘッダーファイルに、定義はソースファイルに、ソースとヘッダーは同じ名前で書くべきだと聞いたことがあります。そして、ソースにヘッダーを含めるだけです。

例を次に示しmyFile.hます。

void printer (void);

でのプリンターの実装は次のmyFile.cppとおりです。

#include "myFile.h"
#include <iostream>
using namespace std;

void printer ()
{
    cout<< "I am a printer";
}

これが私のものmain.cppです:

#include "myFile.h"

int main ()
{
    printer();
    return 0;
}

プログラムを実行すると、予想されるエラーが表示されます: undefined reference to printer. しかし、github や他のプロジェクトのコードを見ると、通常、ソース ファイルではなくヘッダー ファイルが含まれていることがわかります。ヘッダーガードも使用してみましifndefたが、それでも同じエラーが発生しました。次の場合、メイン プログラムは正常にコンパイルされます。

  1. myFile.h に myFIle.cpp を含める場合

  2. メインに myFile.cpp だけを含める場合

同じことをしている間、私は一般的に何をしていますか?

4

4 に答える 4

4

myFile.cppリンクプロセスにあなたを含める必要があります:

g++ myFile.cpp main.cpp

エラー メッセージundefined reference to printerは、コンパイラ エラーではなく、実際のリンカ エラーです。

説明

g++ main.cppコンパイラのみを使用すると、からコードが作成されませんmyFile.cpp。彼は、署名 を持つ関数があるはずであることを知っていますがvoid printer(void)、この関数がどこにあるかはまだわかっていません。コンパイル済みのオブジェクト ファイル ("myFile.o") を提供し、後でそれらをリンクできるため、彼はこの事実を完全に無視しています。

g++ myFile.cpp -c       # compile myFile.cpp
g++ main.cpp -c         # compile myFile.cpp
g++ myFile.o main.o     # link both files together.

-cg++ファイルをコンパイルするだけで、実行可能ファイルにリンクすることはありません。これはリンカーによって行われます (g++おそらくld構成で呼び出されます)。libc++リンカーは、実際のコードなどの必要なすべてのライブラリを含む実行可能ファイルを作成します。

IDE の注意事項

IDE を使用する場合は、必要なすべてのファイルがプロジェクトに含まれていることを確認してください。これには、すべてのヘッダー ファイルとソース ファイル、および追加のライブラリのリンク オプションが含まれます。

于 2012-06-16T10:21:54.637 に答える
1

自分でヘッダー ファイルを定義してインクルードする場合は、次のように "" で囲む必要があります。

#include "myFile.h"
于 2012-06-16T10:21:05.880 に答える
1
#include "myFile.h" // would be better.

"インクルードを囲むのを忘れたようです。

于 2012-06-16T10:21:27.600 に答える
0

あなたは使用する必要があります

#include "myFile.h"

また

#include <myFile.h>

後者はむしろシステムライブラリ用です。どちらの形式も、ファイルの検索方法が異なります。詳細については、

http://msdn.microsoft.com/en-us/library/36k2cdd4%28v=vs.71%29.aspx

于 2012-06-16T10:38:07.577 に答える