使用相对路径名进行交叉编译 - 用于二进制可移植性/嵌入性?(GCC)

Ale*_*ray 6 compiler-construction embedded portability gcc cross-platform

假设我正在创建一个带有一些脚本的应用程序包,可能是一个守护进程,甚至是辅助二进制文件......编译这样的二进制文件时... ./configure/仅使用相对路径可行吗?例如,一个更加认真的Makefile将包含诸如......之类的规定.

--bindir=DIR           user executables [EPREFIX/bin]
--sbindir=DIR          system admin executables [EPREFIX/sbin]
--libexecdir=DIR       program executables [EPREFIX/libexec]
--sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR    modifiable single-machine data [PREFIX/var]
--libdir=DIR           object code libraries [EPREFIX/lib]
--includedir=DIR       C header files [PREFIX/include]
--oldincludedir=DIR    C header files for non-gcc [/usr/include]
--datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
--datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
--infodir=DIR          info documentation [DATAROOTDIR/info]
--localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR           man documentation [DATAROOTDIR/man]
--docdir=DIR           documentation root [DATAROOTDIR/doc/hiawatha]
--htmldir=DIR          html documentation [DOCDIR]
--dvidir=DIR           dvi documentation [DOCDIR]
--pdfdir=DIR           pdf documentation [DOCDIR]
--psdir=DIR            ps documentation [DOCDIR]
Run Code Online (Sandbox Code Playgroud)

这很棒,你可以安装所有东西/opt/local而不是/usr/local.也许甚至会变得疯狂,并通过sed... 重命名二进制文件..我得到它..

但是在我的小脑中仍然不清楚的是,如果以这种方式任意设置路径的能力扩展到相对于可执行文件映射目录的能力,其方式类似于......

--prefix=PREFIX    install architecture-independent files in PREFIX [/usr/local]
--prefix=./        aka  [../relative/to/binary]     
Run Code Online (Sandbox Code Playgroud)

因此,举例来说,无论你在哪里推出了bin从,它总是知道它的.conf文件将是上一级文件夹,在那个相对的../etc文件夹,或者甚至可能就在旁边,在同一目录,./.同样,您可以保证对日志和pid文件等的写访问权限,而无需了解目标的权限/目录结构......

这将使一个完全可移植的/bin /etc /lib /var目录结构,路径内,我可以保证可预测的一些外表...但我不认为它只是"工作"之类的..而且我不确定,如果仅仅是"静态链接"或除此以外 ?真正创建能够移动到另一个系统的二进制文件(虽然,对于这种情况,在相同位置具有相同支持库的那些,以免混淆问题)是否可能以这种方式交叉编译?您是否可以在同一构建周期中构建多个体系结构?(例如i386 AND x86_64同时)

也许我可以使用一个好的GNU/GCC引物(CC,CFLAGS,LDFLAGS,-l,-I和CPP 101等)的推荐,但这不是为数学老师写的 - 以及70年代?

Aar*_*man 0

总的来说,不,那是行不通的。例如,/etc 中的某些内容预计将由整个系统共享,如果您尝试为一个应用程序保留一份私有副本,这些内容将无法正常工作。

话虽如此,您的应用程序可能不会使用系统上的每一个共享资源。使用本地 /bin 和 /sbin,或者从应用程序目录中的相对路径符号链接到真实的 /bin 和 /sbin 应该没问题。/var 似乎不太可能是您的应用程序需要直接了解的东西 - 任何阻止您以自己的方式存储日志或使用 syslogd 的东西?