簡體   English   中英

使用 cmake 從源代碼構建應用程序和 Qt

[英]Build application and Qt from source using cmake

我試圖建立一個使用 qt5.6 的應用程序,qt 和應用程序都是從源代碼構建的(使用 ninja 生成器,在 windows 上使用 Visual Studio 編譯器,在 mac 上使用 clang)。

我被困在 find_package(Qt5Core ..) :當 Qt 還沒有構建時,它不會被找到。 並且因為沒有找到,所以生成的cmake文件不完整。

我想我需要一個設置,它會生成一個 ninja 文件,該文件在構建時構建 Qt,然后在繼續構建之前重新生成 ninja 文件(此時它會找到 qt)。

或者我可以從源代碼構建 Qt + 應用程序的任何其他方式,以便如果我在 Qt 中更改某些內容,它會自動重建。

我應該如何設置我的 cmake 文件來做到這一點?

您可以使用 CMake 的ExternalProject命令從 CMake 中調用 CMake。 您可以在那里指定依賴項,以便您的應用程序僅在構建 Qt 之后構建。

我碰巧在這里有一個小例子,它使用ExternalProject_Add構建一個庫,然后是一個應用程序。 在該示例中,庫和應用程序的 CMake 在make時被調用。

cmake_minimum_required(VERSION 3.0)

include(ExternalProject)

ExternalProject_Add(cmake_lib
    URL ../cmake_lib
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
)

ExternalProject_Add(cmake_app
    DEPENDS cmake_lib
    URL ../cmake_app
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
)

Qt 5 的問題在於它不使用 cmake 來構建,因此除非您將所有內容都告訴它,否則您的 ninja 構建過程不會了解 Qt 的內部結構。 例如,如果您更改 Qt 的任何依賴項,或者如果 Qt 被部分構建,您必須向項目的構建系統添加大量知識,以確定是否需要再次調用 Qt 構建。 這當然可以在“即發即忘”的構建風格中工作,其中構建總是從頭開始,就像在 CI 系統中一樣。 如果目的是更改 Qt 本身並重新運行構建,那么很快就會遇到嚴重的麻煩。 由於 qmake 中的基本架構決策,即使 Qt 自己的構建系統在完全依賴跟蹤方面也存在嚴重問題。

基於 Qmake 的開發人員重新構建 Qt 很糟糕 - 他們這樣做的程度以至於我沒有為該項目做出貢獻,因為它感覺像是一種懺悔,對一個源文件的最簡單的更改需要一分鍾或更長時間重建,對 qmake 項目文件的任何更改有時都會變成多分鍾的事務。

我發現的唯一真正有效並且不會讓你討厭生活、宇宙和一切的解決方案是使用 cmake 重新實現 Qt 的構建配置系統,這樣 qmake 就變得不必要了。 因此,在啟用所有功能的情況下,qtbase 的靜態鏈接統一調試構建需要幾分鍾的時間 - 它非常快速,並且比 Windows 上的 Qt 5 為 MSVC 構建提供的最快選項:qmake+jom 快得多。

Qt 項目在 Qt 6 開發期間努力做到這一點,我相信他們是成功的 :)

暫無
暫無

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

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