RTEMS 4.9.2
現在、NFS サーバーを .NET で実行されているコードに統合しようとしていますPOWER PC 5200
。これを簡潔に説明するのは難しいので、我慢してください。
RTEMS NFS
現在、RTEMS は nfs.c ファイルを介して NFS クライアントを実装しています。コマンド ライン インターフェースを有効にしてmount -t nfs ...
オプションを使用できるようにするには、設定ファイルに追加#define CONFIGURE_SHELL_MOUNT_NFS
し、rtems nfs ファイルを とリンクする必要があります-lnfs
。詳しくはこちらをご覧ください。これを正しく行うと、RTEMS nfs クライアントを実装でき、コマンド ラインからリモート ドライブをマウントできます。
RTEMS NFS クライアントを直接使用する
私たちのプログラムでは RTEMS コマンド ラインを公開していないので、nfs インターフェイスを直接使用できるようにしたいと考えています。RTEMS ライブラリにはlibrtemsNfs.h
、nfs クライアントを実装するための関数が含まれています。これらの関数の実装はnfs.c
、2 つのライブラリのうちの 1 つを作成するためにコンパイルされたものです。
libnfs.a
nfs.rel
ビルドには両方が必要です。コードの一部として、nfsInit(...
で宣言されlibrtemsNfs.h
、 で定義されている関数を使用していますnfs.c
。
エラー
したがって、エラーはかなり明白です。ビルドすると、リンカー エラーが発生します。
D:\Git\nfs_stuff\Src\RTEMS_proj/init/srvinit.cpp:453: undefined reference to `nfsInit(int, int)'
collect2: ld returned 1 exit status
これらのライブラリをリンクしようとしています
これらをリンクするために、複数の方法を試しました。しかし、これをmakefile
誰にとっても簡単にするために、コマンドラインビルドで何が得られるかを示します. 私たちは試しました:
- 推奨される方法は、 -lnfs ( source - an old question ) とリンクすることです。これにより、長くて複雑なビルド コマンドが生成されます。
powerpc-rtems4.9-g++ -g -Wall -g -mcpu=603e -mstrict-align -meabi -msdata -fno-common ... -MANY_PREPROCESSOR_ARGUMENTS ... -MANY_INCLUDE_FILES ... Map=./exe/srvevp. map -lc -lm --gc-sections -lnfs -mcpu=603e -mstrict-align -meabi ... -MANY_OBJECT_FILES ... ./exe/obj/srvinit.o ... -MANY_MORE_OBJECT_FILES
コンパイルおよびリンク コマンドには-lnfs
、問題のあるオブジェクト ファイル ( srvinit.o
) を含める前に があります。しかし、まだリンカー エラーが発生します。
.a
and.rel
ファイルに直接パスでリンクしようとしました。/c/rtems-4.9/powerpc-rtems4.9/5200/lib/libnfs.a /c/rtems-4.9/powerpc-rtems4.9/5200/lib/nfs.rel
これを行うには、コマンド ラインに次を追加します。問題のあるオブジェクト ファイルの前後に追加しました。-L
パスによるリンクを強制するコマンドも試しました。これはすべて同じエラーになります。
その他の情報
これを説明するのは難しいですが、libnfs.a
ファイルの直接リンクを削除すると、nfs を直接使用しなくてもビルドできなくなります。すなわち。内部 RTEMS ファイルは相互にリンクできません。これは非常に奇妙です。コマンドラインオプションをビルドするだけでよいように思え-lnfs
ますが、このフラグがなくても正常にビルドされます。直接インクルードしないと、次のエラーが発生します。
c:/rtems-4.9/powerpc-rtems4.9/5200/lib\librtemscpu.a(libshell_a-main_mount_nfs.o): In function `rtems_shell_nfs_mounter':
e:\CCNET\rtems-4.9\Trunk\build_5200\powerpc-rtems4.9\c\adept_5200\cpukit\libmisc/../../../../../../rtems-4.9.2/c/src/../../cpukit/libmisc/shell/main_mount_nfs.c:46: undefined reference to `rpcUdpInit'
e:\CCNET\rtems-4.9\Trunk\build_5200\powerpc-rtems4.9\c\5200\cpukit\libmisc/../../../../../../rtems-4.9.2/c/src/../../cpukit/libmisc/shell/main_mount_nfs.c:51: undefined reference to `nfsInit'
e:\CCNET\rtems-4.9\Trunk\build_5200\powerpc-rtems4.9\c\5200\cpukit\libmisc/../../../../../../rtems-4.9.2/c/src/../../cpukit/libmisc/shell/main_mount_nfs.c:58: undefined reference to `nfsMount'
collect2: ld returned 1 exit status
リンクに失敗する rtems シェル コードはどれですか。/c/rtems-4.9/powerpc-rtems4.9/5200/lib/libnfs.a /c/rtems-4.9/powerpc-rtems4.9/5200/lib/nfs.rel
をビルド行の最後に追加すると、すべてが成功します。
繰り返しますが、nfs.a
と.rel
ファイルを直接含める必要があるコマンド ライン関数を構築するには、 -lnfs
.
質問
したがって、最初の最も明白な質問は、ライブラリファイルを明示的に指定した場合でも、なぜこれがリンクしないのですか? これについての私の考えは、おそらくファイルには、使用しようとしている関数の定義が含まれていないということです。しかし、RTEMS OS自体の機能をリンクする必要があるため、これは他の情報セクションで信用されていません。
PCやすべてのコンパイラがインストールされていないと再現できないため、これも直接的な答えを出すのが難しいことはわかっています.libファイルに関数の定義が含まれており、リンクされていることを確認するにはどうすればよいですか正しい順序で?このコンパイラは、RTEMS が Power PC 5200 用に提供する BSP 固有GCC
のスタイル コンパイラです。GCC/G++ 4.2 が受け入れるほとんどのコンパイラ オプションを受け入れます。
最後に、このようなリンカの問題をデバッグするための良い方法はありますか? .