あなたのコードは整形式です。
競合するファイル名がないことを確認してください。ファイルが存在し、ファイルの機能が含まれていることを確認してください。たとえば、Dice.cpp
空の があり、新しく作成した を別の場所で編集しているとします。
不要なファイルを削除して、矛盾を最小限に抑えます。main.cpp
、、dice.h
およびのみがありdice.cpp
ます。
エラーがコードと一致しません: "Dice::roll(int)"
。これは を探してint
いますが、関数はunsigned int
. ヘッダーが一致していることを確認してください。
次のことを試してください。
g++ main.cpp -c
これによりmain.o
、メインのコンパイル済みでリンクされていないコードが生成されます。で同じことを行いdice.cpp
ます:
g++ dice.cpp -c
これで、互いにリンクする必要がある 2 つのオブジェクト ファイルができました。次のようにします。
g++ main.o dice.o
そして、それが機能するかどうかを確認してください。そうでない場合は、次の手順を実行します。
nm main.o dice.o
これにより、オブジェクトで使用可能なすべてのシンボルがリストされ、次のようになります。
main.o:
00000000 b .bss
00000000 d .ctors
00000000 d .data
00000000 r .eh_frame
00000000 t .text
00000098 t __GLOBAL__I_main
00000069 t __Z41__static_initialization_and_destruction_0ii
U __ZN4Dice4rollEj
U __ZNSi3getEv
U __ZNSolsEPFRSoS_E
U __ZNSolsEi
U __ZNSt8ios_base4InitC1Ev
U __ZNSt8ios_base4InitD1Ev
U __ZSt3cin
U __ZSt4cout
U __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
00000000 b __ZStL8__ioinit
U ___gxx_personality_v0
U ___main
00000055 t ___tcf_0
U _atexit
00000000 T _main
dice.o:
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T __ZN4Dice4rollEj
U _rand
U _srand
U _time
C++ は関数名を混乱させるため、すべてが奇妙に見えます。(名前をマングリングする標準的な方法はないことに注意してください。これは GCC 4.4 の方法です)。
それを観察し、同じ記号dice.o
を参照してください: . これらが一致しない場合は、それが問題です。たとえば、の一部を次のように変更すると:main.o
__ZN4Dice4rollEj
dice.cpp
// Note, it is an int, not unsigned int
int roll(int dieSize)
次にnm main.o dice.o
、以下を生成します。
main.o:
00000000 b .bss
00000000 d .ctors
00000000 d .data
00000000 r .eh_frame
00000000 t .text
00000098 t __GLOBAL__I_main
00000069 t __Z41__static_initialization_and_destruction_0ii
U __ZN4Dice4rollEj
U __ZNSi3getEv
U __ZNSolsEPFRSoS_E
U __ZNSolsEi
U __ZNSt8ios_base4InitC1Ev
U __ZNSt8ios_base4InitD1Ev
U __ZSt3cin
U __ZSt4cout
U __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
00000000 b __ZStL8__ioinit
U ___gxx_personality_v0
U ___main
00000055 t ___tcf_0
U _atexit
00000000 T _main
dice.o:
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T __ZN4Dice4rollEi
U _rand
U _srand
U _time
これは 2 つの異なる記号を与えることに注意してください。main.o
this: を探し、 this__ZN4Dice4rollEj
をdice.o
含みます__ZN4Dice4rollEi
。(最後の文字が異なります)。
これらの不一致のシンボルを (を使用してg++ main.o dice.o
) コンパイルしようとすると、次のようになります。
undefined reference to `Dice::roll(unsigned int)'