我正在使用CMake為我的專案進行構建,這是一個基于ARM Cortex平臺的嵌入式韌體,使用arm-none-eabi-gcc-6.3.1編譯器,使用VSCode編輯器,并在Windows主機上構建。我正試圖在我用于同一專案的 Windows 系統上進行第二次構建以進行測驗。
我遇到的問題是,每當我需要將我的構建從生產環境切換到測驗環境時,我必須洗掉構建檔案,并使用測驗引數重新運行CMake命令,當我不這樣做時,構建不會將ARM編譯器改為我打算使用的編譯器(我猜測這是一個快取問題)。我試過make clean和make rebuild_cache,認為它可能會清理快取并為我解決這個問題,但沒有成功。
第一次構建:
Projectuild> cmake -G"MinGW Makefiles" -DTARGET_GROUP=test 。
你改變了變數,需要洗掉你的快取。
配置將被重新運行,您可能需要重置一些變數。
以下變數已經改變。
CMAKE_C_COMPILER= C:/MinGW/bin/gcc.exe
CMAKE_CXX_COMPILER= C:/MinGW/bin/g .exe
-- C編譯器的標識是GNU 6.3.0。
-- CXX編譯器的標識是GNU 6.3.0。
-- 檢測C編譯器ABI資訊
-- 檢測C語言編譯器ABI資訊 -- 完成
-- 檢查for working C compiler: C:/MinGW/bin/gcc.exe - 跳過
-- 檢測C語言的編譯特性
-- 檢測C語言編譯特性 -- 完成
-- 檢測CXX編譯器ABI資訊
-- 檢測CXX編譯器ABI資訊 -- 完成
-- 檢查for working CXX compiler: C:/MinGW/bin/g .exe - 跳過
-- 檢測CXX的編譯特性
-- 檢測CXX的編譯特性 -- 完成
-- 配置完成
-- 生成已完成
-- 構建檔案已被寫入。路徑 oProjectuild
Projectuild>make
[ 16%] 構建C物件 src/libs/module_a/CMakeFiles/module_a.dir/module_a.c.obj
[33%] 鏈接C static庫 libmodule_a.a
[33%] 建立目標模塊_a
[50%] 構建C物件 testsuit/CMakeFiles/Unity.dir/unity/src/unity.c.obj
[66%] 鏈接C static庫 libUnity.a
[66%] 建立目標Unity
[83%] 建立C物件test/suite_1/CMakeFiles/suite_1_app.dir/suite_1.c.obj
[100%] 鏈接C語言可執行檔案 suite_1_app.exe
[100%] 建立目標 suite_1_app
第二次構建:
Projectuild> cmake -G"MinGW Makefiles" -DTARGET_GROUP=production 。
你改變了變數,需要洗掉你的快取。
配置將被重新運行,您可能需要重置一些變數。
以下變數已經改變。
CMAKE_C_COMPILER= Path/to/arm-gnu-toolchain/bin/arm-none-eabi-gcc.exe
CMAKE_CXX_COMPILER= Path/to/arm-gnu-toolchain/bin/arm-none-eabi-g .exe
-- C編譯器的標識是GNU 6.3.0。
-- CXX編譯器的標識是GNU 6.3.0。
-- 檢測C編譯器ABI資訊
-- 檢測C語言編譯器ABI資訊 -- 完成
-- 檢查for working C compiler: C:/MinGW/bin/gcc.exe - 跳過
-- 檢測C語言的編譯特性
-- 檢測C語言編譯特性 -- 完成
-- 檢測CXX編譯器ABI資訊
-- 檢測CXX編譯器ABI資訊 -- 完成
-- 檢查for working CXX compiler: C:/MinGW/bin/g .exe - 跳過
-- 檢測CXX的編譯特性
-- 檢測CXX的編譯特性 -- 完成
-- 配置完成
-- 生成已完成
-- 構建檔案已被寫入。路徑 oProjectuild
Projectuild>make
整合編譯器生成的目標模塊_a的依賴關系
[33%] 建立目標模塊_a
整合編譯器生成的目標Unity的依賴關系
[66%] 建立目標Unity
合并編譯器生成的目標 suite_1_app 的依賴項
[100%] 建立目標 suite_1_app
^ 第二次構建不應該編譯這個模塊,因為它只包含在測驗構建中。
CMakeLists.txt:
set(TARGET_GROUP test CACHE STRING "Group to build"/span>)
if(TARGET_GROUP STREQUAL production)
# ARM Lib
include("arm-gnu.cmake")
else()
#交叉編譯時使用 "通用"。
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR amd64)
set(GCC_PATH "C:/MinGW")
set(CMAKE_C_COMPILER ${GCC_PATH}/bin/gcc.exe CACHE PATH ""/span> FORCE)
set(CMAKE_CXX_COMPILER ${GCC_PATH}/bin/g .exe CACHE PATH ""/span> FORCE)
set(CMAKE_LINKER ${GCC_PATH}/bin/ld.exe CACHE PATH ""_span> FORCE)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
#to pass compiler testing as this is cross compilation
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
endif()
# ...
if(TARGET_GROUP STREQUAL production)
# ARM工具鏈
include_directories(toolchain/arm/arm-gnu-toolchain/arm-none-eabi/include)
include_directories(toolchain/arm/arm-gnu-toolchain/lib/gcc/arm-none-eabi/6.3.1/include) /span>
include_directories(toolchain/arm/arm-gnu-toolchain/lib/gcc/arm-none-eabi/6.3.1/include-fixed) /span>
# CMSIS V5.4.0
include_directories(target/cmsis/5.4.0/CMSIS/Core/include)
# 其他來源 -> include_directories(....)。
# ...
# ...
elseif(TARGET_GROUP STREQUAL test)
add_subdirectory(src/libs/module_a)
include(CTest)
add_subdirectory(testuit)
add_subdirectory(test)
else()
message(FATAL_ERROR "Given TARGET_GROUP unknown")
endif()
# ...
if(TARGET_GROUP STREQUAL production)
file(GLOB sources_files
src/*.c
# 其他來源 ...
# ...
# ...
)
設定(SOURCES ${sources_files})
add_executable(${PROJECT_NAME}.elf ${SOURCES})
endif(TARGET_GROUP STREQUAL production)
目前,我有一個臨時的解決方案,為每一種建筑型別制作一個單獨的檔案夾,它們可以完美地作業。 我的問題是,由于我不是構建系統方面的專家,我的解決方案是否是正確的方法?
uj5u.com熱心網友回復:
正如@Tsyvarev所說,如果你想要不同的構建,你必須使用不同的目錄。 在這里,你試圖在同一個build目錄中構建兩者。 相反,創建一個子目錄test來構建-DTARGET_GROUP=test,和一個不同的子目錄prod來構建-DTARGET_GROUP=production:
Project> mkdir test
專案> cd test
專案 est> cmake -G"MinGW Makefiles" -DTARGET_GROUP=test 。
Project est> cd .
專案> mkdir prod
專案> cd prod
專案prod> cmake -G"MinGW Makefiles" -DTARGET_GROUP=production 。
當然,你可以隨心所欲地稱呼這些目錄
。uj5u.com熱心網友回復:
因為你希望這能集成到VSCode中,用CMake構建工具包做配置改變,這就是在呼叫CMake之前設定編譯器。 你可以指定額外的用戶工具包定義,并在VSCode界面中選擇編譯器工具包。
。重新撰寫 CMake 檔案,使其他一切都以編譯器的選擇為條件。
然后,VSCode cmake-tools 擴展支持構建目錄名稱的變數擴展。 其中的選項包括${buildKit}和${buildKitTargetArch}。 讓這個后綴成為構建目錄設定的一部分(你可以選擇只在你的作業區設定,還是在你的系統上更全面地設定)。
現在,當你切換工具包時,CMake 將會接收到目錄的變化,并愉快地存在于兩個不同的構建目錄中。
另外,cmake-tools 現在提供了變體,它可以用來在正常的 Release、Debug、RelWithDebInfo 等之外添加額外的 Production 和 Test。 還有額外的構建目錄擴展變數,用于獲取當前所選變體的資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/306954.html
標籤:
