-1

わかりました、これは素晴らしい質問ではないかもしれませんが、私は少し立ち往生しています.

私は3つのプログラムを持っています:

pegio.c/pegio.h - デバイスのハードウェアの初期化と機能を実行します

PegIOHandler.cpp/PegIOHandler.h - デバイスの I/O を処理します

PegRTU.cpp - メイン関数

私のプロジェクトは、opendnp3 (DNP3 プロトコルを使用してデータを送信できるようにする) ライブラリを実装しています。さて、それをコンパイルするには、最初に pegio.c ファイルをコンパイルします

gcc -c pegio.c -o pegio.o

簡単、ここまでは分かりました。

次に、IOHandler をコンパイルし、使用する pegio.c を参照します。

g++ -c PegIOHandler.cpp pegio.c -o PegIOHandler.o -std=c++0x

これで、次の出力が得られます。

g++: 警告: pegio.o: リンクが行われていないため、リンカー入力ファイルは使用されていません

ただし、オブジェクト ファイルは作成されます。ただし、PegIOHandler は、PegIOHandler.cpp および PegIOHandler.h に含まれる opendnp3 ヘッダー ファイルを実装します。「-c」を使用せずにこれらのファイルをコンパイルしようとすると、opendnp3 ファイルへの未定義の参照があることがわかります。それらを自分のプロジェクトにリンクする必要があることはわかっていますが、どうすればよいですか?

次に、3 番目で最後のファイルをコンパイルします。

g++ PegRTU.cpp pegio.o PegIOHandler.o -o pegrtu -std=c++0x

これにより、opendnp3 ファイルへの未定義の参照があることがわかります。では、opendnp3 ライブラリをプロジェクト / コード ファイルにリンクするにはどうすればよいですか? ありがとう!

4

1 に答える 1

3

ああ。非常に多くの誤解。さらにソース ファイルをオブジェクト コードにコンパイルするために、以前にコンパイルされたオブジェクト ファイルは必要ありません。ただし、必要なライブラリを含め、コンパイル プロセスの最後にそれらをリンクする必要があります。概して:

gcc -c pegio.c -o pegio.o
g++ -c PegIOHandler.cpp -o PegIOHandler.o -std=c++0x
g++ -c PegRTU.cpp -o PegRTU.o -std=c++0x
g++ -o executable_name *.o -lopendnp3 # or whatever linker flag is needed for OpenDNP3

そして、どうぞ、 これを読んでください。

于 2013-06-28T08:06:12.683 に答える