跨平台编译指定编译器无效解决方法(x86 & arm64)

跨平台编译指定编译器无效解决方法(x86 & arm64)

问题描述

在CMakeLists.txt中指定了交叉编译的编译器,但是从结果来看并没有使用指定的交叉编译器。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(Arm64Demo)

# 设置CMake使用交叉编译工具链
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
# 强制指定C和C++编译器
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc CACHE PATH "C Compiler")
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++ CACHE PATH "C++ Compiler")

# 添加源代码目录
add_executable(hello_arm64 src/main.cpp)

# ----------------------
# 打印编译器信息
message(STATUS "C Compiler: ${CMAKE_C_COMPILER}")
message(STATUS "C++ Compiler: ${CMAKE_CXX_COMPILER}")

execute_process(COMMAND ${CMAKE_C_COMPILER} --version OUTPUT_VARIABLE GCC_VERSION)
message(STATUS "C Compiler Version: ${GCC_VERSION}")
# -----------------------

结果:

cmake ..
-- The C compiler identification is GNU 9.5.0
-- The CXX compiler identification is GNU 9.5.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - 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: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- C Compiler: /usr/bin/cc
-- C++ Compiler: /usr/bin/c++
-- C Compiler Version: cc (Ubuntu 9.5.0-6ubuntu2) 9.5.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


-- Configuring done (2.6s)
-- Generating done (0.0s)
-- Build files have been written to: /mnt/d/wsl_workspace/arm64demo/build

解决方法

从CMake输出结果来看,CMake并没有使用指定的交叉编译器 /usr/bin/aarch64-linux-gnu-gcc/usr/bin/aarch64-linux-gnu-g++,而是使用了默认的本地编译器 /usr/bin/cc/usr/bin/c++。这可能是由于CMake没有正确识别交叉编译工具链。

要解决这个问题,可以尝试以下几种方法:

1. 确保交叉编译工具链已安装

首先,确保已经安装了 aarch64-linux-gnu-gccaarch64-linux-gnu-g++ 工具链。可以通过以下命令检查它们是否已安装:

aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-g++ --version

如果没有安装,你可以通过以下命令安装:

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

2. 使用工具链文件

CMake推荐使用工具链文件来配置交叉编译。你可以创建一个工具链文件,例如 aarch64-toolchain.cmake,内容如下:

# aarch64-toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# 指定交叉编译器的路径
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)

# 指定根文件系统的路径(如果有)
# set(CMAKE_FIND_ROOT_PATH /path/to/sysroot)

# 搜索库和头文件的路径
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

然后在你的CMake命令中使用这个工具链文件:

cmake -DCMAKE_TOOLCHAIN_FILE=aarch64-toolchain.cmake ..

3. 强制指定编译器

如果你不想使用工具链文件,可以尝试在CMakeLists.txt中强制指定编译器路径,并确保它们被正确使用。你可以在 project() 调用之前设置编译器:

cmake_minimum_required(VERSION 3.10)

# 强制指定C和C++编译器
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc CACHE PATH "C Compiler" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++ CACHE PATH "C++ Compiler" FORCE)

project(Arm64Demo)

# 添加源代码目录
add_executable(hello_arm64 src/main.cpp)

# 打印编译器信息
message(STATUS "C Compiler: ${CMAKE_C_COMPILER}")
message(STATUS "C++ Compiler: ${CMAKE_CXX_COMPILER}")

execute_process(COMMAND ${CMAKE_C_COMPILER} --version OUTPUT_VARIABLE GCC_VERSION)
message(STATUS "C Compiler Version: ${GCC_VERSION}")

4. 检查环境变量

确保没有环境变量(如 CCCXX)覆盖了你在CMakeLists.txt中指定的编译器。可以通过以下命令检查:

echo $CC
echo $CXX

如果这些变量被设置,可以通过以下命令取消设置:

unset CC
unset CXX

5. 清理构建目录

有时候CMake会缓存旧的配置信息,导致新的配置没有生效。可以尝试删除 build 目录并重新生成构建文件:

rm -rf build
mkdir build
cd build
cmake ..

总结

通过以上步骤,应该能够成功配置CMake使用交叉编译工具链。如果问题仍然存在,请检查工具链路径是否正确,并确保没有其他配置干扰CMake的交叉编译设置。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值