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



假设我正在创建一个应用程序包,其中包含一些脚本,可能是一个守护进程,甚至是一个helper二进制文件…当编译这样的二进制文件时…在。/configure/make中只使用相对路径是否可行?例如,一个更严谨的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]

这是伟大的,你可以安装所有的/opt/local而不是/usr/local。甚至可能会发疯,通过sed重命名二进制文件。我明白了…

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

--prefix=PREFIX    install architecture-independent files in PREFIX [/usr/local]
--prefix=./        aka  [../relative/to/binary]     

因此,例如,无论您从哪里启动bin,它总是知道它的.conf文件将在一个文件夹中,在相对的../etc文件夹中,或者甚至可能就在它旁边,在同一个目录中,./。类似地,您可以保证对日志和pid文件等的写访问,而不必担心目标的权限/目录结构…

这将启用一个完全可移植的/bin /etc /lib /var目录结构,在PATH中,我可以保证一些可预测性…但我不认为它就这样"起作用"……我不确定是否只是"静态链接"或其他方式?真正创建能够移动到另一个系统的二进制文件(,尽管在这种情况下,移动到具有相同位置的相同支持库的系统,以便不混淆问题)是否可能以这种方式交叉编译?您能否在同一构建周期内为多个架构进行构建?(例如i386和x86_64同时运行)

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

总的来说,不,这是行不通的。例如,/etc中有一些东西预计会被整个系统共享,如果你试图为一个应用程序保留私人副本,则无法正常工作。

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

最新更新