建置目標

Meson 提供了四種建置目標:執行檔、函式庫(可以在建置組態時設定為建置成靜態或共享,或兩者皆建置)、靜態函式庫和共享函式庫。它們分別使用 executablelibrarystatic_libraryshared_library 命令來建立。所有以這種方式建立的物件都是不可變的。也就是說,它們一旦被建構之後,您就無法更改它們的任何方面。這確保了與給定建置目標相關的所有資訊都在一個明確定義的位置指定。

函式庫和執行檔

舉例來說,以下是如何建置函式庫的方法。

project('shared lib', 'c')
library('mylib', 'source.c')

通常建議使用 library 命令,而不是 shared_librarystatic_library,然後使用 default_library 內建選項在建置組態時設定要建置哪些函式庫(靜態或共享,或兩者皆建置)。

在類 Unix 作業系統中,共享函式庫可以進行版本控制。Meson 使用關鍵字參數來支援此功能,如果該函式庫在編譯時被設定為靜態,則將忽略這些參數。

project('shared lib', 'c')
library('mylib', 'source.c', version : '1.2.3', soversion : '1')

常見的做法是建置一個函式庫,然後建置一個連結到它的執行檔。這也受到支援。

project('shared lib', 'c')
lib = library('mylib', 'source.c')
executable('program', 'prog.c', link_with : lib)

Meson 會設定好所有內容,以便可以直接從建置目錄中執行產生的執行檔。無需編寫 Shell 腳本或設定環境變數。

一個目標可以有多個語言的原始碼檔案。

project('multilang', 'c', 'cpp')
executable('multiexe', 'file.c', 'file2.cc')

物件檔案

有時您無法從原始碼建置檔案,而需要使用現有的物件檔案。一個典型的例子是使用第三方提供的物件檔案。可以像指定原始碼一樣指定物件檔案。

exe = executable('myexe', 'source.cpp', objects : 'third_party_object.o')

另一種情況是您想要在另一個目標中直接使用一個目標中建置的物件檔案。一個典型的例子是當您建置共享函式庫時,它有一個內部類別,該類別不會在 ABI 中匯出。這意味著即使您連結到該函式庫,也無法存取它。此問題的典型解決方法包括建置該函式庫的共享和靜態版本,或將原始碼檔案放置在測試執行檔的原始碼清單中。這兩種方法都會導致原始碼被建置兩次,速度很慢。

在 Meson 中,您可以從目標中提取物件檔案,並直接在其他目標中使用它們。這是它的語法。

lib = shared_library('somelib', 'internalclass.cc', 'file.cc', ...)
eo = lib.extract_objects('internalclass.cc')
executable('classtest', 'classtest.cpp', objects : eo)

這裡我們取得內部類別物件,並直接在測試中使用它。原始碼檔案只會編譯一次。

請注意,不小心使用此功能可能會導致奇怪的錯誤。例如,嘗試在共享函式庫中使用執行檔或靜態函式庫的物件將無法運作,因為共享函式庫物件需要特殊的編譯器標誌。使用者有責任確保這一切正確。因此,強烈建議您僅以如上所述的方式使用此功能來產生單元測試執行檔。

搜尋結果如下