一 背景知识
Conan 和 CMake 是两个非常流行的跨平台开发工具,它们可以让开发者轻松管理依赖和构建项目,支持多种操作系统和架构。下面是一些关于 conan 和 cmake 的介绍:
-
Conan
Conan 是一个用于管理 C++ 依赖项的开源工具。它可以从公共或私有存储库中自动下载和安装依赖项。Conan 可以轻松地管理不同版本的依赖项,并支持多个操作系统和编译器。使用 Conan,开发者可以更加轻松地构建跨平台应用程序。 -
CMake
CMake 是一个跨平台的构建系统,它可以自动生成 Makefile、Visual Studio、Xcode 等构建系统所需的文件。CMake 可以让开发者轻松地构建跨平台应用程序,而无需编写复杂的构建脚本。CMake 支持多种编译器和操作系统,并且可以与其他工具(如 conan)配合使用。 -
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
文章来源:https://www.toymoban.com/news/detail-491087.html -
编译
cmake --build build_arm64 --config Release --parallel 12
文章来源地址https://www.toymoban.com/news/detail-491087.html
到了这里,关于Linux conan+cmake管理的项目如何进行多架构编译(x86_64及交叉编译arm64)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!