要了解为什么找不到crti.o,或者编译器都找到了哪些路径,可以通过strace进行调查:
使用strace
你可以使用strace命令来跟踪编译命令执行时的系统调用,从而获得打开的文件路径信息。例如:
<BASH>
strace gcc <your_arguments> 2>&1 | grep crti.o
这将输出 gcc 执行过程中尝试打开crti.o文件的相关信息。
makefile添加 strace
####### Build rules
verifyspec: $(OBJECTS)
strace $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) 2>&1 | grep crti.o
结果
可以知道编译的时候它的搜索路径 只有 /lib/ /usr/lib 其他都不生效
genvict@genvict:~/rk3568_ubutnu/3rd/qt/qt-everywhere-src-5.15.10/config.tests/verifyspec$ make
strace /opt/gcc-aarch64-linux-gnu-10.3.0/bin/aarch64-linux-gnu-g++ --sysroot=/home/genvict/rk3568_ubutnu/sysroot -Wl,-O1 -Wl,-rpath-link,/home/genvict/rk3568_ubutnu/sysroot/usr/lib -Wl,-rpath-link,/home/genvict/rk3568_ubutnu/sysroot/usr/lib/aarch64-linux-gnu -Wl,-rpath-link,/home/genvict/rk3568_ubutnu/sysroot/lib/aarch64-linux-gnu -Wl,-rpath-link,/home/genvict/rk3568_ubutnu/sysroot/usr/lib/aarch64-linux-gnu -Wl,-rpath-link,/home/genvict/rk3568_ubutnu/sysroot/lib/aarch64-linux-gnu -o verifyspec verifyspec.o -lc -lm -L/home/genvict/rk3568_ubutnu/sysroot/lib/aarch64-linux-gnu -L/home/genvict/rk3568_ubutnu/sysroot/usr/lib -L/home/genvict/rk3568_ubutnu/sysroot/usr/lib/aarch64-linux-gnu 2>&1 | grep crti.o
access("/opt/gcc-aarch64-linux-gnu-10.3.0/bin/../lib/gcc/aarch64-linux-gnu/8.3.0/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/opt/gcc-aarch64-linux-gnu-10.3.0/bin/../lib/gcc/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/opt/gcc-aarch64-linux-gnu-10.3.0/bin/../lib/gcc/aarch64-linux-gnu/8.3.0/../../../../aarch64-linux-gnu/lib/aarch64-linux-gnu/8.3.0/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/opt/gcc-aarch64-linux-gnu-10.3.0/bin/../lib/gcc/aarch64-linux-gnu/8.3.0/../../../../aarch64-linux-gnu/lib/../lib64/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/home/genvict/rk3568_ubutnu/sysroot/lib/aarch64-linux-gnu/8.3.0/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/home/genvict/rk3568_ubutnu/sysroot/lib/../lib64/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/home/genvict/rk3568_ubutnu/sysroot/usr/lib/aarch64-linux-gnu/8.3.0/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/home/genvict/rk3568_ubutnu/sysroot/usr/lib/../lib64/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/opt/gcc-aarch64-linux-gnu-10.3.0/bin/../lib/gcc/aarch64-linux-gnu/8.3.0/../../../../aarch64-linux-gnu/lib/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/home/genvict/rk3568_ubutnu/sysroot/lib/crti.o", R_OK) = -1 ENOENT (No such file or directory)
access("/home/genvict/rk3568_ubutnu/sysroot/usr/lib/crti.o", R_OK) = -1 ENOENT (No such file or directory)
/opt/gcc-aarch64-linux-gnu-10.3.0/bin/../lib/gcc/aarch64-linux-gnu/8.3.0/../../../../aarch64-linux-gnu/bin/ld: cannot find crti.o: No such file or directory
解决
把库软连接到/home/genvict/rk3568_ubutnu/sysroot/lib/crti.o
genvict@genvict:~/rk3568_ubutnu/sysroot/lib$ ln -s aarch64-none-linux-gnu/crt1.o crt1.o
genvict@genvict:~/rk3568_ubutnu/sysroot/lib$ ln -s aarch64-none-linux-gnu/crti.o crti.o
genvict@genvict:~/rk3568_ubutnu/sysroot/lib$ ln -s aarch64-none-linux-gnu/crtn.o crtn.o