2012-05-06 38 views
0

私はXCodeを使ってプログラムを書いていました。 Mac上で問題なく動作します。私たちのプロジェクトはLinuxマシンでコンパイルされると言われたので、提出する前にLinux上で動作することを確認したかったのです。私はLinux上でコンパイルしようとしたとき、それは私にいくつかの参照エラーを与えた:OS XからLinuxに移行する際のエラーRed Hat

/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はそのように書かれていません。これはリンカのエラーですか?私はOS Xが内部的にそれをするようにプログラムされていると思う。

+2

Linux用のコードをどのように構築していますか? – juanchopanza

+0

あなたのMakefileを投稿してください –

答えて

1

あなたは関数をヘッダに宣言していますが、定義はありません。main.cppを実行可能ファイルに変換しようとすると、未定義の参照につながります。

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

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

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

+0

はい、うまくいきました。まあ、ReadFile関数です。私は他の人にも同じことをします。どうもありがとう。 私はいくつか質問がありました - それでOS Xはこれを私にしていますか? Linuxがそうでない理由はありますか? コードを変更してこれを行う必要がないようにできることはありますか? g ++ main.cpp また、私は自分の関数を宣言することで何を意味するのですか?定義はありません。 xyz.hに宣言があり、xyz.cppに定義があると思いましたか?それは十分ではないですか? – maverick1989

0

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

これらのすべてを自動的に処理するには、IDEを使用するか、またはMakefileを書き込む必要があります。 1つのコマンドを主張する場合は、すべてのソースファイルを行に含める限り(g ++ * .cppなど)、1回の変更ごとに完全な再コンパイルが強制されます。

関連する問題