编译器在交叉编译时找不到头文件

时间:2021-07-26 19:49:02

标签: cmake cross-compiling

我使用以下 bash 脚本为 jetson nano 创建了一个交叉编译器:

#!/bin/bash
set -e

# mkdir cross-scratchpad
# cd cross-scratchpad
# FILES="http://ftpmirror.gnu.org/binutils/binutils-2.36.tar.gz
# http://ftpmirror.gnu.org/gcc/gcc-11.1.0/gcc-11.1.0.tar.gz &
# http://ftpmirror.gnu.org/glibc/glibc-2.33.tar.xz &
# http://ftpmirror.gnu.org/mpfr/mpfr-4.1.0.tar.xz
# http://ftpmirror.gnu.org/gmp/gmp-6.2.1.tar.xz & 
# http://ftpmirror.gnu.org/mpc/mpc-1.2.1.tar.gz &
# ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.0.tar.bz2
# ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz
# https://developer.nvidia.com/embedded/l4t/r32_release_v5.2/sources/t210/public_sources.tbz2"
# echo "$FILES" | xargs -n 1 -P 5 wget
# wait
for f in *.tar*; do tar xf "$f"; done
cd gcc-11.1.0
ln -s ../mpfr-4.1.0 mpfr
ln -s ../gmp-6.2.1 gmp
ln -s ../mpc-1.2.1 mpc
ln -s ../isl-0.18 isl
ln -s ../cloog-0.18.1 cloog
cd ..
sudo rm -rf /opt/cross/*
export PATH=/opt/cross/bin:"$PATH"
mkdir build-binutils
cd build-binutils
../binutils-2.36/configure --prefix=/opt/cross --target=aarch64-linux --disable-multilib --disable-werror
make -j8
make install
cd ..
tar -xjf public_sources.tbz2
cd Linux_for_Tegra/source/public/
tar -xjf kernel_src.tbz2
cd kernel/kernel-4.9
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross/aarch64-linux headers_install
cd ../../../../..
mkdir -p build-gcc
cd build-gcc
../gcc-11.1.0/configure --prefix=/opt/cross --target=aarch64-linux --enable-languages=c,c++ --disable-multilib --disable-werror
make -j8 all-gcc
make install-gcc
cd ..
mkdir -p build-glibc
cd build-glibc
../glibc-2.33/configure --prefix=/opt/cross/aarch64-linux --build="$MACHTYPE" --host=aarch64-linux --target=aarch64-linux --with-headers=/opt/cross/aarch64-linux/include --disable-multilib --disable-werror libc_cv_forced_unwind=yes
make install-bootstrap-headers=yes install-headers
make -j8 csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /opt/cross/aarch64-linux/lib
aarch64-linux-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /opt/cross/aarch64-linux/lib/libc.so
touch /opt/cross/aarch64-linux/include/gnu/stubs.h
cd ..
cd build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
cd ..
cd build-glibc
make -j8
make install
cd ..
cd build-gcc
make -j8
make install
cd ..

我现在正在尝试将它与 cmake 一起使用来构建一个项目。

我编写了以下工具链文件,以便在使用 CMake 创建 makefile 时使用:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_FIND_ROOT_PATH path/to/root/of/jetson/nano)

set(CROSS_ROOT /opt/cross/bin)

set(CMAKE_AR                        ${CROSS_ROOT}/aarch64-linux-ar)
set(CMAKE_ASM_COMPILER              ${CROSS_ROOT}/aarch64-linux-as)
set(CMAKE_C_COMPILER                ${CROSS_ROOT}/aarch64-linux-gcc)
set(CMAKE_CXX_COMPILER              ${CROSS_ROOT}/aarch64-linux-g++)
set(CMAKE_LINKER                    ${CROSS_ROOT}/aarch64-linux-ld)
set(CMAKE_OBJCOPY                   ${CROSS_ROOT}/aarch64-linux-objcopy)
set(CMAKE_RANLIB                    ${CROSS_ROOT}/aarch64-linux-ranlib)
set(CMAKE_SIZE                      ${CROSS_ROOT}/aarch64-linux-size)
set(CMAKE_STRIP                     ${CROSS_ROOT}/aarch64-linux-strip)
set(CMAKE_GCOV                      ${CROSS_ROOT}/aarch64-linux-gcov)

set(CMAKE_C_FLAGS                   "${APP_C_FLAGS} -Wno-psabi" CACHE INTERNAL "")
set(CMAKE_CXX_FLAGS                 "${APP_CXX_FLAGS} ${CMAKE_C_FLAGS}" CACHE INTERNAL "")

set(CMAKE_C_FLAGS_DEBUG             "-O0 -g" CACHE INTERNAL "")
set(CMAKE_C_FLAGS_RELEASE           "-O3 -DNDEBUG" CACHE INTERNAL "")
set(CMAKE_CXX_FLAGS_DEBUG           "${CMAKE_C_FLAGS_DEBUG}" CACHE INTERNAL "")
set(CMAKE_CXX_FLAGS_RELEASE         "${CMAKE_C_FLAGS_RELEASE}" CACHE INTERNAL "")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

path/to/root/of/jetson/nano 是我使用 rsync 创建的根目录的路径。当我在目标机器上运行 cmake .. && make -j8 时,项目编译正常。

使用 cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake 在主机上配置成功:

-- The C compiler identification is GNU 11.1.0
-- The CXX compiler identification is GNU 11.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /opt/cross/bin/aarch64-linux-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /opt/cross/bin/aarch64-linux-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr (found version "4.5.3") 
-- Configuring done
-- Generating done
-- Build files have been written to: /path/to/my/project/build

但是,当我运行 make -j8 时,表单中的每个包含都会出错:

fatal error: glm/gtc/matrix_transform.hpp: No such file or directory
    4 | #include <glm/gtc/matrix_transform.hpp>

这是怎么回事,我该如何解决?

0 个答案:

没有答案