簡體   English   中英

CMake 交叉編譯 Windows 到 Windows

[英]CMake cross compiling Windows to Windows

有沒有人嘗試過在 cmake 中將 Windows 交叉編譯為 Windows ?

我有一個異國情調的場景。 我正在參與一個使用 cmake 構建的開源項目。 該項目有幾個平台端口。 例如。 Windows、Linux等。每個平台都有自己的cmake下標,有些還有單獨的工具鏈腳本。

我想添加另一個端口/平台:Win32 FreeRTOS。 win32 FreeRTOS 本身就是一種好奇心。 最好的教育。 因此它不應該污染現有的 Windows 端口。 因此,我創建了一個名為 win32freertos.cmake 的新平台腳本。 在其中編譯了一組不同的文件和庫。 我創建了一個新的工具鏈腳本,就像交叉編譯時所做的那樣:

我認為它不應該包含太多內容。

include_guard()

# The name of the target operating system
set(CMAKE_SYSTEM_NAME win32freertos)

然后它使用 Microsoft Visual Studio CMake 構建:(與其他 Windows 端口相同。)

cmake -B build.win32freertos -DCMAKE_TOOLCHAIN_FILE=cmake/tools/toolchain/win32freertos.cmake

這在某種程度上有效。 缺少一些編譯器參數。 這可以通過以下方式解決:

add_definitions(-DWIN32 -D_WINDOWS)
add_compile_options(/Zi /Od /Ob0 /WX /RTC1 /GR /MDd /EHsc)
add_link_options(/DEBUG /INCREMENTAL)

在這一點上,至少從表面上看,一切似乎都還不錯。 唯一的問題是,編譯后的 output 被命名為“.a”(用於庫)和“”用於 exe 文件。 (Unix 風格的 output 文件。)這使得單元測試失敗。 (而且這很糟糕。)通常這將通過以下方式解決:

set(CMAKE_EXECUTABLE_SUFFIX ".exe")

不幸的是,這不起作用。 (???)似乎沒有任何效果。 似乎在創建新平台時,MSVC (Visual Studio) / CMake 中缺少一些重要的初始化。 所以,相反,我想出了這個:

set(CMAKE_CXX_COMPILER_VERSION "19.28") #Visual Studio 16 2019
include("${CMAKE_ROOT}/Modules/Platform/Windows-MSVC-CXX.cmake")
include("${CMAKE_ROOT}/Modules/Platform/Windows.cmake")

這行得通。 但這是一個非常脆弱的解決方案。 例如。 我硬編碼了 Visual Studio 編譯器版本(實際上是 MSC_VER。)我硬編碼了一些隨機的 Visual Studio cmake 腳本路徑,下次升級 VS。 這可能會失敗。 否則在使用較舊的 VS 時會失敗,而且寫這樣的東西很糟糕。 在構建腳本中。

順便說一句,我還沒有找到從系統中檢索 MSC_VER 的任何方法。 有一些相關的值,可以提取:

CMAKE_GENERATOR Visual Studio 16 2019
VSCMD_VER=16.8.4
VCToolsVersion=14.28.29333

但它們無法轉換為我發現的 MSC_VER。 另外,忘記大多數 cmake 變量,你認為你知道。 在這一點上,它們還沒有設置。 (上面的 Windows CMake 腳本設置了很多。)

有人有什么好的建議嗎? 在 CMake 中構建 Windows 應用程序時,有沒有人嘗試過創建備用工具鏈腳本?

避免使用目錄命令add_definitionsadd_compile_optionsadd_link_options等。而是將它們添加到標准_INIT變量中的工具鏈文件中。

也可以使用其特定於語言的變體來覆蓋后綴:

set(CMAKE_SYSTEM_NAME win32freertos)

set(CMAKE_CXX_FLAGS_INIT "-DWIN32 -D_WINDOWS /Zi /Od /Ob0 /WX /RTC1 /GR /MDd /EHsc")
set(CMAKE_C_FLAGS_INIT "-DWIN32 -D_WINDOWS /Zi /Od /Ob0 /WX /RTC1 /GR /MDd /EHsc")
set(CMAKE_EXE_LINKER_FLAGS_INIT "/DEBUG /INCREMENTAL")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "/DEBUG /INCREMENTAL")
set(CMAKE_STATIC_LINKER_FLAGS_INIT "/DEBUG /INCREMENTAL")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "/DEBUG /INCREMENTAL")

set(CMAKE_EXECUTABLE_SUFFIX_CXX ".exe")
set(CMAKE_EXECUTABLE_SUFFIX_C ".exe")

set(CMAKE_SHARED_LIBRARY_SUFFIX_CXX ".dll")
set(CMAKE_SHARED_LIBRARY_SUFFIX_C ".dll")

set(CMAKE_SHARED_MODULE_SUFFIX_CXX ".dll")
set(CMAKE_SHARED_MODULE_SUFFIX_C ".dll")

set(CMAKE_STATIC_LIBRARY_SUFFIX_CXX ".lib")
set(CMAKE_STATIC_LIBRARY_SUFFIX_C ".lib")

set(CMAKE_IMPORT_LIBRARY_SUFFIX_CXX ".lib")
set(CMAKE_IMPORT_LIBRARY_SUFFIX_C ".lib")

如果沒有 MVE,很難知道這是否可行。

有了上面的提示,我創建了這個工具鏈文件。 到目前為止,它看起來很有希望。

# The name of the target operating system
set(CMAKE_SYSTEM_NAME win32freertos)

set(CMAKE_C_FLAGS_DEBUG_INIT "/MDd /Zi /Ob0 /Od /RTC1")
set(CMAKE_C_FLAGS_INIT "/DWIN32 /D_WINDOWS /W3")
set(CMAKE_C_FLAGS_MINSIZEREL_INIT "/MD /O1 /Ob1 /DNDEBUG")
set(CMAKE_C_FLAGS_RELEASE_INIT "/MD /O2 /Ob2 /DNDEBUG")
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MD /Zi /O2 /Ob1 /DNDEBUG")

set(CMAKE_CXX_FLAGS_DEBUG_INIT "/MDd /Zi /Ob0 /Od /RTC1")
set(CMAKE_CXX_FLAGS_INIT "/DWIN32 /D_WINDOWS /W3 /GR /EHsc")
set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "/MD /O1 /Ob1 /DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "/MD /O2 /Ob2 /DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/MD /Zi /O2 /Ob1 /DNDEBUG")

set(CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT "/debug /INCREMENTAL")
set(CMAKE_EXE_LINKER_FLAGS_INIT "/machine:x64")
set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL_INIT "/INCREMENTAL:NO")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT "/INCREMENTAL:NO")
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO_INIT "/debug /INCREMENTAL")

set(CMAKE_SHARED_LINKER_FLAGS_DEBUG_INIT "/debug /INCREMENTAL")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "/machine:x64")
set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL_INIT "/INCREMENTAL:NO")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE_INIT "/INCREMENTAL:NO")
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO_INIT "/debug /INCREMENTAL")

set(CMAKE_STATIC_LINKER_FLAGS_INIT "/machine:x64")

set(CMAKE_EXECUTABLE_SUFFIX_CXX ".exe")
set(CMAKE_EXECUTABLE_SUFFIX_C ".exe")
set(CMAKE_SHARED_LIBRARY_SUFFIX_CXX ".dll")
set(CMAKE_SHARED_LIBRARY_SUFFIX_C ".dll")
set(CMAKE_SHARED_MODULE_SUFFIX_CXX ".dll")
set(CMAKE_SHARED_MODULE_SUFFIX_C ".dll")
set(CMAKE_STATIC_LIBRARY_SUFFIX_CXX ".lib")
set(CMAKE_STATIC_LIBRARY_SUFFIX_C ".lib")
set(CMAKE_IMPORT_LIBRARY_SUFFIX_CXX ".lib")
set(CMAKE_IMPORT_LIBRARY_SUFFIX_C ".lib")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM