在 poky 上首次尝试编译 core-image-minimal。`Build Configuration:BB_VERSION = \'1.44.0\'BUILD_SYS = \'x86_64-linux\'NATIVELSBSTRING ...
在 poky 上第一次尝试编译 core-image-minimal。
`Build Configuration:
BB_VERSION = "1.44.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "universal"
TARGET_SYS = "x86_64-poky-linux"
MACHINE = "qemux86-64"
DISTRO = "poky"
DISTRO_VERSION = "3.0.4"
TUNE_FEATURES = "m64 core2"
TARGET_FPU = ""
meta
meta-poky
meta-yocto-bsp = "<unknown>:<unknown>"`
编译期间出现错误并且编译失败:
`ERROR: qemu-native-4.1.0-r0 do_compile: oe_runmake failed
ERROR: qemu-native-4.1.0-r0 do_compile: Execution of '/home/build/tmp/work/x86_64-linux/qemu-native/4.1.0-r0/temp/run.do_compile.4889' failed with exit code 1:
make[1]: Entering directory '/home/build/tmp/work/x86_64-linux/qemu-native/4.1.0-r0/qemu-4.1.0/slirp'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/home/build/tmp/work/x86_64-linux/qemu-native/4.1.0-r0/qemu-4.1.0/slirp'
CXX disas/nanomips.o
g++: fatal error: Killed signal terminated program cc1plus
compilation terminated.
make: *** [/home/build/tmp/work/x86_64-linux/qemu-native/4.1.0-r0/qemu-4.1.0/rules.mak:94: disas/nanomips.o] Error 1
make: *** Deleting file 'disas/nanomips.o'
WARNING: /home/build/tmp/work/x86_64-linux/qemu-native/4.1.0-r0/temp/run.do_compile.4889:1 exit 1 from 'exit 1'
ERROR: Logfile of failure stored in: /home/build/tmp/work/x86_64-linux/qemu-native/4.1.0-r0/temp/log.do_compile.4889`
**无法找到该问题的适当解决方案。是否存在我需要注意的版本不匹配?
提前致谢。**
我尝试安装 cmake,检查 g++ 版本。没有帮助。
首先每个动态链接程序最重要的依赖就是链接器,所有的so库都必须和链接器的版本相匹配。
让我们举一个简单的例子:我有一个新的 ubuntu 系统,我在其中运行一些程序(在我的情况下是 D 编译器 - ldc2)。我想在旧的 CentOS 上运行它,但由于较旧的 glibc 库,这是不可能的。我得到了
ldc2-1.5.0-linux-x86_64/bin/ldc2: /lib64/libc.so.6: version `GLIBC_2.15' not found (required by ldc2-1.5.0-linux-x86_64/bin/ldc2)
ldc2-1.5.0-linux-x86_64/bin/ldc2: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ldc2-1.5.0-linux-x86_64/bin/ldc2)
我必须将所有依赖项从 ubuntu 复制到 centos。正确的方法如下:
首先,让我们检查所有依赖项:
ldd ldc2-1.5.0-linux-x86_64/bin/ldc2
linux-vdso.so.1 => (0x00007ffebad3f000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f965f597000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f965f378000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f965f15b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f965ef57000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f965ec01000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f965e9ea000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f965e60a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f965f79f000)
linux-vdso.so.1 不是一个真正的库,我们不必关心它。
/lib64/ld-linux-x86-64.so.2 是链接器,linux使用它来将可执行文件与所有动态库链接起来。
其余文件是真正的库,所有文件连同链接器都必须复制到 centos 中的某个地方。
我们假设所有库和链接器都在'/mylibs'目录中。
ld-linux-x86-64.so.2 - 我已经说过了 - 是链接器。它不是动态库,而是静态可执行文件。您可以运行它,并看到它甚至有一些参数,例如 --library-path(我将返回到它)。
在Linux上,动态链接程序可能仅通过其名称启动,例如
/bin/ldc2
Linux 会将此类程序加载到 RAM 中,并检查为其设置了哪个链接器。通常在 64 位系统上,它是 /lib64/ld-linux-x86-64.so.2(在您的文件系统中,它是指向实际可执行文件的符号链接)。然后 Linux 运行链接器并加载动态库。
您也可以稍微改变一下,做这样的技巧:
/mylibs/ld-linux-x86-64.so.2 /bin/ldc2
这是强制Linux使用特定链接器的方法。
现在我们可以回到前面提到的参数--library-path
/mylibs/ld-linux-x86-64.so.2 --library-path /mylibs /bin/ldc2
它将运行 ldc2 并从 /mylibs 加载动态库。
这是使用选定的(非系统默认的)库调用可执行文件的方法。