一 背景知識
Conan 和 CMake 是兩個非常流行的跨平臺開發(fā)工具,它們可以讓開發(fā)者輕松管理依賴和構建項目,支持多種操作系統(tǒng)和架構。下面是一些關于 conan 和 cmake 的介紹:
-
Conan
Conan 是一個用于管理 C++ 依賴項的開源工具。它可以從公共或私有存儲庫中自動下載和安裝依賴項。Conan 可以輕松地管理不同版本的依賴項,并支持多個操作系統(tǒng)和編譯器。使用 Conan,開發(fā)者可以更加輕松地構建跨平臺應用程序。 -
CMake
CMake 是一個跨平臺的構建系統(tǒng),它可以自動生成 Makefile、Visual Studio、Xcode 等構建系統(tǒng)所需的文件。CMake 可以讓開發(fā)者輕松地構建跨平臺應用程序,而無需編寫復雜的構建腳本。CMake 支持多種編譯器和操作系統(tǒng),并且可以與其他工具(如 conan)配合使用。 -
Conan 和 CMake 的結合
Conan 和 CMake 可以很好地結合使用,以便更好地管理依賴項和構建項目。使用 Conan,開發(fā)者可以輕松地下載和安裝依賴項,并在 CMake 中使用。在使用 CMake 構建項目時,可以使用 Conan 提供的工具來檢查依賴項是否已正確安裝,并自動下載和安裝未安裝的依賴項(conan_cmake_install
)。這使得開發(fā)者可以更加高效和準確地構建跨平臺應用程序。
總之,使用 conan + cmake 可以讓開發(fā)者更加輕松地管理依賴和構建項目,支持多種操作系統(tǒng)和架構,從而使跨平臺開發(fā)更加容易和高效。
目前,xxx項目已經(jīng)完成了Mac(x86_64/arm64)、Windows(x86/x64)和Linux(x86_64)三個桌面端系統(tǒng)及相關架構的統(tǒng)一管理和編譯?,F(xiàn)在,我們正在補充Linux arm64交叉編譯的支持,以滿足更廣泛的需求。
二 如何實現(xiàn)Linux arm64交叉編譯
工具 | 交叉編譯本機環(huán)境 | 交叉編譯目標環(huán)境 |
---|---|---|
CMake | CMAKE_HOST_SYSTEM_NAME | CMAKE_SYSTEM_NAME |
Conan | BUILD | HOST |
在 CMake 中,CMAKE_HOST_SYSTEM_NAME 變量表示編譯器運行的本地系統(tǒng)名稱,而 CMAKE_SYSTEM_NAME 變量表示目標系統(tǒng)的名稱。在交叉編譯時,需要將 CMAKE_SYSTEM_NAME 設置為目標系統(tǒng)的名稱,以便 CMake 可以正確地生成構建文件。
Conna 要求交叉編譯必須指定兩個 profile 信息,一個表示 BUILD 環(huán)境就是當前編譯環(huán)境信息,一個表示 HOST 目標系統(tǒng)環(huán)境信息
。這樣它才會啟用交叉編譯配置。當然我們可以在 CMakeLists.txt 會判斷是否指定了 CONAN_PROFILE_BUILD 和 CONAN_PROFILE_HOST,沒有指定時我們可以啟用自動判斷。
通過 CMake 傳遞 CONAN_PROFILE_BUILD 和 CONAN_PROFILE_HOST 參數(shù),我們就可以自動化將這些配置信息傳遞給 Conan,無需手動去執(zhí)行 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
文章來源:http://www.zghlxwxcb.cn/news/detail-491087.html -
編譯
cmake --build build_arm64 --config Release --parallel 12
文章來源地址http://www.zghlxwxcb.cn/news/detail-491087.html
到了這里,關于Linux conan+cmake管理的項目如何進行多架構編譯(x86_64及交叉編譯arm64)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!