0

私はXCodeを使用してプログラムを作成しました。Macでは問題なく動作します。私たちのプロジェクトはLinuxマシンでコンパイルされると言われたので、提出する前にLinuxで動作することを確認したかったのです。Linuxでコンパイルしようとすると、いくつかの参照エラーが発生しました。

/tmp/cckwoehj.o: In function `main':
main.cpp:(.text+0x9): undefined reference to `ReadFile()'
/tmp/cckwoehj.o: In function `leftSearch(NODE*, int)':
main.cpp:(.text+0x38b): undefined reference to `conflict(int**)'
main.cpp:(.text+0x3ca): undefined reference to `removeAllRowsWithLiteral(int**, int)'
main.cpp:(.text+0x3ec): undefined reference to `removeAllSpecifiedLiteral(int**, int)'
main.cpp:(.text+0x4ec): undefined reference to `conflict(int**)'
main.cpp:(.text+0x522): undefined reference to `unitPropagation(int**)'
main.cpp:(.text+0x538): undefined reference to `conflict(int**)'
/tmp/cckwoehj.o: In function `rightSearch(NODE*, int)':
main.cpp:(.text+0x992): undefined reference to `conflict(int**)'
main.cpp:(.text+0x9d4): undefined reference to `removeAllRowsWithLiteral(int**, int)'
main.cpp:(.text+0x9f3): undefined reference to `removeAllSpecifiedLiteral(int**, int)'
main.cpp:(.text+0xaf3): undefined reference to `conflict(int**)'
main.cpp:(.text+0xb29): undefined reference to `unitPropagation(int**)'
main.cpp:(.text+0xb3f): undefined reference to `conflict(int**)'
collect2: ld returned 1 exit status

私がオンラインで見つけたものはすべてテンプレートについて話します。テンプレートは使用していません。私はまた、私が持っていない32ビットと64ビットのOSの問題に関するものを見つけました。

ヘッダーで宣言されているReadFileという関数があります。mainから呼び出し、そのヘッダーファイルをmainにインクルードします。何が問題なのかわかりません。OS Xがコンパイルされて実行され、Linuxが実行されない場合、OS Xが内部で実行していることは明らかであると考えていますが、Linuxはそのように記述されていないと思います。これはリンカーエラーですか?OSXはそれを内部的に行うようにプログラムされていると思います。

4

2 に答える 2

1

関数をヘッダーで宣言していますが、定義がないため、main.cpp を実行可能ファイルに変換しようとすると未定義の参照が発生します。

すべてのソース ファイルをコンパイルし、それらを (正しい順序で) リンクする必要があります。

g++ -c ReadFile.cpp
#...
g++ -c main.cpp
g++ main.o ... ReadFile.o -o my_executable

右側のオブジェクト ファイルは、コマンドラインの左側のオブジェクト ファイルで定義された未解決のシンボルに依存していません。

于 2012-05-06T14:15:17.830 に答える
0

XCode は IDE であるため、リンクの順序を処理すると思います。

これらすべてを自動的に処理するには、IDE を使用したり、Makefile を作成したりする必要があります。単一のコマンドを要求する場合は、その行にすべてのソース ファイル (g++ *.cpp など) を含めれば可能ですが、これによりすべての変更に対して完全な再コンパイルが強制されます。

于 2012-05-06T21:01:46.420 に答える