我目前正在尝试将NFS服务器集成到在RTEMS 4.9.2上的POWER PC 5200上运行的某些代码中。简洁地解释这将很难,所以请多多包涵。

RTEMS NFS

当前,RTEMS通过nfs.c文件实现NFS客户端。为了激活命令行界面并能够使用mount -t nfs ...选项,您需要将#define CONFIGURE_SHELL_MOUNT_NFS添加到配置文件中,并使用-lnfs链接rtems nfs文件。有关更多详细信息,请参见here。正确执行此操作可以使我们实现RTEMS nfs客户端,并且可以从命令行安装远程驱动器。

直接使用RTEMS NFS客户端

我们没有在程序中公开RTEMS命令行,因此我们希望能够直接使用nfs接口(interface)。 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)链接,这样做会产生一个不错的冗长而复杂的构建命令:



  • 在包含有问题的目标文件(-lnfs)之前,我们的compile and link命令具有srvinit.o。但是我们仍然收到链接器错误。

  • 我试图通过路径直接链接到.a.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 shell代码无法链接的原因。如果我们在构建行的末尾添加/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接受的大多数编译器选项。

    最后,有什么好的方法可以调试此类链接器问题?

    最佳答案

    为了使整个库API对您的C++代码可用,您可以将库 header 本身包含在extern“C”块中,如下所示:

    extern "C" {
        #include <librtemsNfs.h>
    }
    

    有关为何需要此操作的更多详细信息,请参见此处:Why do we need extern "C"{ #include <foo.h> } in C++?

    10-07 17:20