ls: cannot access './hiwork/osdrvhi3518e.C01': No such file or directory

ls: cannot access ‘./hiwork/osdrvhi3518e.C01’: No such file or directory问题解决

每次编译执行make 和 make clean的时候都会报出上面题目中的问题,虽然并不影响编译,但是强迫症禁不住啊。于是彻底解决了一下,问题就出在mpp目录下的那个Makefile.param里。

# Allocated the linux position
ifneq ($(shell ls $(HIWORK_PATH)/osdrv/$(HIARCH)$(CVER)), )
	ifeq ($(HIARCH),hi3519)
		export LINUX_ROOT?=$(HIWORK_PATH)/osdrv$(HIARCH)$(CVER)/$(CPU_TYPE)/opensource/kernel/$(KERNEL_NAME)		
	else
		export LINUX_ROOT?=$(HIWORK_PATH)/osdrv$(HIARCH)$(CVER)/opensource/kernel/$(KERNEL_NAME)
	endif	
else
	export LINUX_ROOT?=$(SDK_PATH)/osdrv/opensource/kernel/$(KERNEL_NAME)
endif

就是这一段ifneq里的,首先由问题:ls: cannot access ‘./hiwork/osdrvhi3518e.C01’: No such file or directory可以判断出ifneq里第1个参数是不存在的,也就是说这个参数为空等于第二个,所以这个ifneq是不成立的!所以应该执行下面第二个else里的内容。
其实由实际情况可以知道不一定要判断,因为肯定走第二个else而且第二个else其实也就一条路可以走,所以我直接把这段内容除了第二个else这条路的其他都删除掉了,也就是整段只保留了下面这一句:

export LINUX_ROOT?=$(SDK_PATH)/osdrv/opensource/kernel/$(KERNEL_NAME)

而实际按照这个LINUX_ROOT走下去查看目录发现,kernel也确实就是在这个目录的。
综上,问题解决!

<think>我们正在解决一个交叉编译问题:在为目标架构 aarch64-linux-musleabi 交叉编译时,链接器报告错误,跳过不兼容的库,并且无法找到 -lcjson。 根据引用[1]中的类似问题(找不到/lib/libc.so.6),我们可能面临类似的问题:链接器在错误的路径中查找库(可能是主机系统的库而不是目标系统的库)。 引用[2]和[3]提供了交叉编译的一些步骤,包括获取目标系统的标准库和头文件等。 分析: 错误信息“ld skipping incompatible”通常意味着链接器找到了一个库文件,但是它的架构(比如x86_64)与目标架构(aarch64)不兼容,因此被跳过。然后链接器继续寻找其他库,但找不到兼容的版本,因此报错“cannot find -lcjson”。 解决步骤: 1. 确保已经为目标架构(aarch64-linux-musleabi)安装了cjson库(或者交叉编译了cjson库)。 2. 确保链接器知道去哪里寻找目标架构的库(即指定库路径)。 具体操作: a. 交叉编译cjson库: 我们需要先为aarch64-linux-musleabi目标交叉编译cjson库,并将生成的库文件和头文件安装到某个目录(例如:/path/to/aarch64-libs/)。 b. 在编译我们的程序时,通过编译选项指定库路径和头文件路径: - 指定头文件路径:-I/path/to/aarch64-libs/include - 指定库路径:-L/path/to/aarch64-libs/lib - 链接库:-lcjson 例如,编译命令可能如下: aarch64-linux-musleabi-gcc -I/path/to/aarch64-libs/include -L/path/to/aarch64-libs/lib -o my_program my_program.c -lcjson c. 如果已经交叉编译了cjson库,但仍然遇到问题,请检查库路径是否正确,以及该路径下是否存在名为libcjson.a或libcjson.so的库文件(注意库文件的命名规则)。 d. 另外,注意musl工具链可能需要使用静态链接。如果cjson库是动态库(.so),那么需要确保目标系统上有该动态库。或者,我们可以使用静态链接(如果有静态库libcjson.a)来避免运行时依赖。 如果以上步骤还不能解决问题,可能需要检查交叉编译工具链的配置,确保工具链的sysroot设置正确。sysroot是交叉编译工具链查找库和头文件的根目录。 设置sysroot的方法: 在编译命令中加入:--sysroot=/path/to/sysroot 其中/path/to/sysroot是目标系统的根文件系统(包含目标系统的usr/lib, usr/include等目录)。 注意:交叉编译时,通常需要目标系统的头文件和库文件。这些文件可以从目标系统的根文件系统中获取,或者通过交叉编译工具链自带的sysroot(如果有的话)。 总结: 1. 交叉编译cjson库(如果还没有的话)。 2. 在编译程序时,通过-I和-L指定正确的头文件和库路径,或者通过--sysroot指定根文件系统。 3. 确保库文件(libcjson.a或libcjson.so)存在于指定的库路径中,并且是目标架构(aarch64)兼容的。 如果问题仍然存在,请提供更多信息,例如: - 交叉编译工具链的安装方式(例如:musl-cross-make?) - cjson库的交叉编译步骤 - 完整的编译命令和错误输出</think>### 交叉编译中链接器无法找到 `libcjson` 的解决方案 当为目标架构 `aarch64-linux-musleabi` 交叉编译时出现 `ld skipping incompatible` 和 `cannot find -lcjson` 错误,表明链接器无法找到兼容的目标平台库文件。以下是系统级解决方案: #### 核心问题分析 1. **架构不兼容** `skipping incompatible` 表示找到的库文件架构(如 x86_64)与目标架构(aarch64)不匹配[^1]。 2. **库路径缺失** `cannot find -lcjson` 表明交叉编译工具链未配置正确的库搜索路径[^2]。 #### 解决方案步骤 1. **交叉编译 `libcjson` 库** 先为目标平台编译依赖库: ```bash # 下载源码 git clone https://github.com/DaveGamble/cJSON cd cJSON # 配置交叉编译环境 export CC=aarch64-linux-musleabi-gcc export AR=aarch64-linux-musleabi-ar export RANLIB=aarch64-linux-musleabi-ranlib # 静态编译(推荐) mkdir build && cd build cmake -DCMAKE_SYSTEM_NAME=Linux \ -DCMAKE_SYSTEM_PROCESSOR=aarch64 \ -DCMAKE_C_COMPILER=$CC \ -DENABLE_CJSON_UTILS=On \ -DBUILD_SHARED_LIBS=Off .. # 关闭动态库 make ``` 生成的静态库路径:`libcjson.a` 2. **配置链接器路径** 在项目编译命令中显式指定库路径: ```bash aarch64-linux-musleabi-gcc main.c -I/path/to/cJSON/include \ -L/path/to/cJSON/build \ -lcjson -o output ``` 关键参数: - `-I`:指定头文件目录 - `-L`:指定库文件目录 - `-lcjson`:显式链接静态库 3. **验证工具链配置** 检查交叉编译器的默认搜索路径: ```bash aarch64-linux-musleabi-gcc -print-search-dirs ``` 若路径缺失,通过 `-sysroot` 指定目标系统根目录: ```bash -Wl,--sysroot=/opt/aarch64-linux-musleabi/sysroot ``` 4. **使用静态链接(推荐)** 在 musl 环境中优先使用静态库避免运行时依赖: ```bash # 强制静态链接 aarch64-linux-musleabi-gcc ... -Wl,-Bstatic -lcjson -Wl,-Bdynamic ... ``` #### 根本原因预防 - **工具链完整性** 确保交叉工具链包含完整的 musl 运行时(参考引用[2]的 CRT/SDK 获取流程)。 - **依赖库管理** 所有第三方库需用**相同工具链**重新交叉编译(参考引用[3]的 eudev 编译流程)。 - **环境隔离** 使用容器化编译避免主机库污染: ```dockerfile FROM ubuntu:20.04 RUN apt-get update && apt-get install -y gcc-aarch64-linux-musleabi COPY cjson /build WORKDIR /build RUN make CC=aarch64-linux-musleabi-gcc ``` > **关键验证**:执行 `file libcjson.a` 应输出 `ELF 64-bit LSB relocatable, ARM aarch64`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值