我想僅使用 CLI 在 Windows 上編譯 OpenCV C/C (MSYS2) 程式。執行此操作的 GNU Bash 方法是(在 MSYS2 MINGW64 Shell 上運行良好):
g main.cc -o main `pkg-config --cflags --libs opencv4`
Bash 完美地將反引號識別為子運算式,但是 PowerShell 不會:
> g main.cc -o main `pkg-config --cflags --libs opencv4`
g .exe: error: unrecognized command-line option '--cflags'
g .exe: error: unrecognized command-line option '--libs'
我做了一些研究,PowerShell上的等價物是
g main.cc -o main $(pkg-config --cflags --libs opencv4)
盡管$(pkg-config --cflags --libs opencv4) 是在 PowerShell 中撰寫子運算式作為echo命令的正確方法,但它會產生正確的輸出(在這種情況下,我需要編譯器包含和聯結器標志):
> echo $(pkg-config --cflags --libs opencv4)
-IC:/msys64/mingw64/bin/../include/opencv4 -LC:/msys64/mingw64/bin/../lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_barcode -lopencv_bgsegm -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm (...)
它根本行不通:
> g main.cc -o main $(pkg-config --cflags --libs opencv4)
main.cc:1:10: fatal error: opencv2/imgcodecs.hpp: No such file or directory
1 | #include <opencv2/imgcodecs.hpp>
| ^~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
因此,我需要使用詳細的解決方法來編譯我的檔案:
> g main.cc -o main -IC:/msys64/mingw64/bin/../include/opencv4 -LC:/msys64/mingw64/bin/../lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_barcode -lopencv_bgsegm -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash (...)
我的 PowerShell 版本:
> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.22621.608
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.22621.608
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
我的問題是:如何使這個特定的子運算式在 PowerShell 中作業,這樣我就不必求助于復制和粘貼
pkg-config --cflags --libs opencv4 after輸出的冗長后備g main.cc -o main?
uj5u.com熱心網友回復:
相當于您的bash命令是:
g main.cc -o main (-split (pkg-config --cflags --libs opencv4))
那是:
(pkg-config --cflags --libs opencv4)執行您的pkg-config呼叫,并通過將其包含在(...)分組運算子中,其輸出可以參與更大的運算式。使用一元形式
-split的字串拆分運算子,然后將pkg-config呼叫的輸出拆分為一個以空格分隔的標記陣列,這(部分)相當于通過其稱為分詞的外殼擴展bash隱式執行的操作。將陣列作為引數傳遞給 PowerShell 中的外部程式會導致其元素作為單獨的引數傳遞。
筆記:
使用
$(...),PowerShell 的子運算式運算子在這種情況下不起作用,因為它的輸出將作為一個整體,作為單個引數傳遞給目標可執行檔案(或者,在輸出多行的外部程式呼叫的情況下,每一行在full將作為引數傳遞)。一般來說,在PowerShell中
bash需要$(...)(或其遺留形式)通常就足夠`...`(...)了(在分配中甚至不需要它,例如,$var = Get-Date);PowerShell的主要用例$(...)是 inside"...",即在可擴展(雙引號)字串內更根本的是,PowerShell沒有等效的
bash'外殼擴展:值得注意的是,不支持引數擴展(例如
${var//foo/bar}),需要使用運算式來代替(例如)($var -replace 'foo', 'bar')不帶引號的引數通常不受特殊解釋,除非它們包含元字符,如果要逐字使用元字符,出于句法原因,則必須單獨轉義
`(所謂的反引號,是 PowerShell 的轉義字符),或要求將整個引數括在引號中。`每個目標命令都可以將特殊字符(例如首字母)解釋為
~參考主目錄,或者解釋諸如通配符模式*.txt之類的引數 - 無論此類引數是否在引號中傳遞。變數參考(例如
$var)和基于它們的簡單運算式(例如$var.Property)、(分組)運算式(例如 ((1 2)) 以及子運算式 ($(...)) 和陣列子運算式 (@(...)) 可以按原樣用作引數,即使它們是評估為包含空格- 在呼叫外部程式的情況下,在 Windows 上,PowerShell 將根據需要在幕后對結果進行雙引號;如上所述,多個輸出每個都作為引數傳遞。- 有關更多資訊,請參閱此答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/530770.html
上一篇:在if陳述句中使用變數的屬性
