Linux conan+cmake管理的项目如何进行多架构编译(x86_64及交叉编译arm64)

一 背景知识

Conan 和 CMake 是两个非常流行的跨平台开发工具,它们可以让开发者轻松管理依赖和构建项目,支持多种操作系统和架构。下面是一些关于 conan 和 cmake 的介绍:

  1. Conan
    Conan 是一个用于管理 C++ 依赖项的开源工具。它可以从公共或私有存储库中自动下载和安装依赖项。Conan 可以轻松地管理不同版本的依赖项,并支持多个操作系统和编译器。使用 Conan,开发者可以更加轻松地构建跨平台应用程序。

  2. CMake
    CMake 是一个跨平台的构建系统,它可以自动生成 Makefile、Visual Studio、Xcode 等构建系统所需的文件。CMake 可以让开发者轻松地构建跨平台应用程序,而无需编写复杂的构建脚本。CMake 支持多种编译器和操作系统,并且可以与其他工具(如 conan)配合使用。

  3. Conan 和 CMake 的结合
    Conan 和 CMake 可以很好地结合使用,以便更好地管理依赖项和构建项目。使用 Conan,开发者可以轻松地下载和安装依赖项,并在 CMake 中使用。在使用 CMake 构建项目时,可以使用 Conan 提供的工具来检查依赖项是否已正确安装,并自动下载和安装未安装的依赖项(conan_cmake_install)。这使得开发者可以更加高效和准确地构建跨平台应用程序。

总之,使用 conan + cmake 可以让开发者更加轻松地管理依赖和构建项目,支持多种操作系统和架构,从而使跨平台开发更加容易和高效。

目前,xxx项目已经完成了Mac(x86_64/arm64)、Windows(x86/x64)和Linux(x86_64)三个桌面端系统及相关架构的统一管理和编译。现在,我们正在补充Linux arm64交叉编译的支持,以满足更广泛的需求。

二 如何实现Linux arm64交叉编译

工具 交叉编译本机环境 交叉编译目标环境
CMake CMAKE_HOST_SYSTEM_NAME CMAKE_SYSTEM_NAME
Conan BUILD HOST

在 CMake 中,CMAKE_HOST_SYSTEM_NAME 变量表示编译器运行的本地系统名称,而 CMAKE_SYSTEM_NAME 变量表示目标系统的名称。在交叉编译时,需要将 CMAKE_SYSTEM_NAME 设置为目标系统的名称,以便 CMake 可以正确地生成构建文件。

Conna 要求交叉编译必须指定两个 profile 信息,一个表示 BUILD 环境就是当前编译环境信息,一个表示 HOST 目标系统环境信息。这样它才会启用交叉编译配置。当然我们可以在 CMakeLists.txt 会判断是否指定了 CONAN_PROFILE_BUILD 和 CONAN_PROFILE_HOST,没有指定时我们可以启用自动判断。

通过 CMake 传递 CONAN_PROFILE_BUILD 和 CONAN_PROFILE_HOST 参数,我们就可以自动化将这些配置信息传递给 Conan,无需手动去执行 Conan install 流程,减少出错可能和麻烦的步骤。

1. 交叉编译工具链配置(cmake用)

# CMakeLists.txt
if (UNIX AND NOT APPLE)
    if (TARGET_ARCH STREQUAL "arm64")
        message(STATUS "build Linux arm64")
        set(CMAKE_SYSTEM_NAME Linux)
        set(CMAKE_SYSTEM_PROCESSOR arm64)
        set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
        set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
    else ()
        message(STATUS "build Linux x86_64")
    endif ()
endif ()

TARGET_ARCH变量是自己定义的,用来传递给cmake当前的平台架构:包括x86_64,和arm64

2. conan依赖安装配置(就是上文提到的两个profile)

# CMakeLists.txt
if (NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
    message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
    file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/master/conan.cmake" "${CMAKE_BINARY_DIR}/conan.cmake")
endif ()
include(${CMAKE_BINARY_DIR}/conan.cmake)
if (CONAN_PROFILE_BUILD AND CONAN_PROFILE_HOST)
conan_cmake_install(PATH_OR_REFERENCE .. BUILD missing
                    SETTINGS_HOST build_type=${CMAKE_BUILD_TYPE}
                    SETTINGS_BUILD build_type=${CMAKE_BUILD_TYPE}
                    PROFILE_BUILD ${CONAN_PROFILE_BUILD}
                    PROFILE_HOST ${CONAN_PROFILE_HOST})
else ()
    conan_cmake_autodetect(settings)
    conan_cmake_install(PATH_OR_REFERENCE .. BUILD missing SETTINGS ${settings})
endif ()
  • linux-x86_64 profile
include(default)

[settings]
os=Linux
arch=x86_64
compiler=gcc
compiler.version=7
compiler.libcxx=libstdc++11
compiler.cppstd=14
  • linux-arm64 profile
include(default)

[settings]
os=Linux
arch=armv8
compiler=gcc
compiler.version=7
compiler.libcxx=libstdc++11
compiler.cppstd=14

[env]
CC=aarch64-linux-gnu-gcc
CXX=aarch64-linux-gnu-g++

3. 构建指令 (比如在x86_64平台上交叉编译arm64目标)

  • 构建
    cmake -Bbuild_arm64 -DCMAKE_BUILD_TYPE=Release DTARGET_ARCH=arm64 -DCONAN_PROFILE_BUILD=$(pwd)/.profiles/linux-x86_64 -DCONAN_PROFILE_HOST=$(pwd)/.profiles/linux-arm64

  • 编译
    cmake --build build_arm64 --config Release --parallel 12

你可能感兴趣的:(交叉编译,coann,cmake,linux)