ARM平台tpm2-tss交叉编译make install失败求助
ARM平台交叉编译tpm2-tss时make install失败问题
问题场景
交叉编译ARM平台的tpm2-tss,configure和make步骤均正常完成,但执行make install时出现文件找不到的错误。
错误日志
[/app/workspace/tpm2-openssl-1.2.0/tpm2-tss]$ make install make[1]: Entering directory '/app/workspace/tpm2-openssl-1.2.0/tpm2-tss' /usr/bin/mkdir -p '/usr/local/lib' /bin/bash ./libtool --mode=install /usr/bin/install -c src/tss2-mu/libtss2-mu.la src/tss2-tcti/libtss2-tctildr.la src/tss2-tcti/libtss2-tcti-device.la src/tss2-tcti/libtss2-tcti-swtpm.la src/tss2-tcti/libtss2-tcti-mssim.la src/tss2-tcti/libtss2-tcti-pcap.la src/tss2-tcti/libtss2-tcti-cmd.la src/tss2-tcti/libtss2-tcti-spi-helper.la src/tss2-tcti/libtss2-tcti-spi-ltt2go.la src/tss2-tcti/libtss2-tcti-spidev.la src/tss2-tcti/libtss2-tcti-i2c-helper.la src/tss2-sys/libtss2-sys.la src/tss2-esys/libtss2-esys.la src/tss2-rc/libtss2-rc.la src/tss2-policy/libtss2-policy.la src/tss2-fapi/libtss2-fapi.la '/usr/local/lib' libtool: install: /usr/bin/install -c src/tss2-mu/.libs/libtss2-mu.so.0.0.1 /usr/local/lib/libtss2-mu.so.0.0.1 /usr/bin/install: cannot stat 'src/tss2-mu/.libs/libtss2-mu.so.0.0.1': No such file or directory make[1]: *** [Makefile:12466: install-libLTLIBRARIES] Error 1
补充信息
- 报错提示找不到的
libtss2-mu.so.0.0.1实际存在于/usr/local/lib,是指向工具链目录的软链接:
[/usr/local/lib]$ ls -lrth total 149K drwxr-xr-x 3 root root 3 Jun 5 03:39 python3.10 drwxr-xr-x 1 root root 3 Jun 5 03:40 python3.11 lrwxrwxrwx 1 root root 91 Sep 18 13:13 libtss2-mu.so.0.0.1 -> /opt/toolchains/foo/blabla/armv7ahf-neon-oe-linux-gnueabi/usr/lib/libtss2-mu.so.0.0.0
- 已设置
LD_LIBRARY_PATH,并修改了.la文件的dependency_libs字段为:dependency_libs=' -L/opt/toolchains/foo/blabla/armv7ahf-neon-oe-linux-gnueabi/usr/lib' - 交叉编译命令:
CFLAGS="-Wno-error=missing-field-initializers" ./configure --build=x86_64-pc-linux-gnu --host=arm-oe-linux-gnueabi --prefix=/usr/local
解决思路
检查编译产物路径
报错里libtool试图从编译目录的src/tss2-mu/.libs/下复制文件,但该路径下没有生成目标文件,说明交叉编译时可能直接复用了工具链里的预编译库,跳过了本地编译。这种情况下make install会因为找不到本地编译产物而失败。修改configure参数强制本地编译
交叉编译时如果工具链中存在同名库,configure可能会跳过本地编译。可以添加--with-sysroot参数指定工具链根目录,确保configure优先使用指定路径下的资源并生成本地编译产物:CFLAGS="-Wno-error=missing-field-initializers" ./configure --build=x86_64-pc-linux-gnu --host=arm-oe-linux-gnueabi --prefix=/usr/local --with-sysroot=/opt/toolchains/foo/blabla/armv7ahf-neon-oe-linux-gnueabi清理后重新编译
先清理之前的编译残留文件,避免干扰:make distclean再重新执行configure、make、make install流程。
指定工具链libtool
交叉编译时libtool可能需要使用工具链自带的版本,避免用主机系统的libtool导致兼容问题:export LIBTOOL=/opt/toolchains/foo/blabla/armv7ahf-neon-oe-linux-gnueabi/usr/bin/libtool CFLAGS="-Wno-error=missing-field-initializers" ./configure --build=x86_64-pc-linux-gnu --host=arm-oe-linux-gnueabi --prefix=/usr/local临时手动复制库文件
如果需要快速解决,可以手动将工具链中的库文件复制到编译目录对应路径,再执行make install:mkdir -p src/tss2-mu/.libs/ cp /opt/toolchains/foo/blabla/armv7ahf-neon-oe-linux-gnueabi/usr/lib/libtss2-mu.so.0.0.0 src/tss2-mu/.libs/libtss2-mu.so.0.0.1 make install此为临时方案,建议优先解决编译过程的根本问题。
内容的提问来源于stack exchange,提问作者user190549
相关产品推荐
相关产品推荐

