2011-08-30 62 views
24

在Windows上,我使用CodeSourcery的交叉編譯器套件交叉編譯ARM/linux程序。我使用mingw msys作爲我的命令解釋器,並且經常會破壞我的路徑和路徑名。例如,爲了建立我的計劃,我調用如何阻止mingw和msys在命令行中輸入的路徑名稱?

arm-none-linux-gnueabi-gcc.exe -Wall -g \ 
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \ 
    -Wl,-rpath=/usr/lib/myrpath \ 
    -I../targetsysroot/usr/include \ 
    myprogram.c -o myprogram 

當然,我想/usr/lib/myrpath逐字插入myprogram可執行文件 - 在ARM Linux目標,我爲編制不使用MinGW的MSYS或。但這裏是最終進入它:

... 
0x0000000f (RPATH)   Library rpath: [C:/MinGW/msys/1.0/lib/myrpath] 
... 

不正是我想要的。如果我直接在cmd.exe命令行上調用gcc,我會在可執行文件中獲得正確的rpath。如果我在msys命令行上調用gcc,我會得到損壞的rpath。如果我使用cmd.exe命令行中的make運行的Makefile調用gcc,我仍然會得到一個損壞的rpath(!)

任何想法如何關閉這種惱人的行爲?

回答

5

我不認爲有一種方法可以關閉它。 MSYS是舊版Cygwin版本的一個分支,其中一些調整旨在改進Windows集成,在調用本地Windows程序時自動進行POSIX路徑轉換可以說是最重要的。這樣做的麻煩在於,不可能總是說出一個論點是一條道路還是別的什麼東西,或者在這種情況下,它是否實際上是一條不應該被翻譯的道路。翻譯由set of heuristics指導。

你可以嘗試使用MinGW make而不是MSYS make(是的,它們是不同的東西),這是一個沒有POSIX路徑支持和轉換的本地Windows版本構建。用mingw-get install mingw32-make安裝,並調用mingw32-make

或者你可以嘗試Cygwin,理想情況下與工具鏈的Cygwin構建。

+0

謝謝 - 該鏈接(啓發式)幫我「假了」 MinGW和通過不受干擾的方式獲取我的路徑。 –

+2

錯誤!如果關閉,有一種方法可以切換。 http://stackoverflow.com/a/34386471/404615 –

16

我剛剛發現了一個巧妙的技巧,以避免MSYS/MinGW爲您翻譯路徑。

如果使用雙斜槓啓動路徑,則MSYS不會將路徑轉換爲DOS格式。因此,在OP的例子中,-rpath開關應該是這樣規定的:

-Wl,-rpath=//usr/lib/myrpath

所有的Unix/Linux工具似乎處理這些虛假斜槓沒有任何問題,所以即使你的二進制文件的rpath將與//開始usr/...我認爲裝載機會做正確的事情。

+6

它不適用於我,但-rpath =「// usr \ lib \ myrpath」(帶有引號和反斜槓的路徑) –

+0

甜!這個技巧完全爲我工作。謝謝! – BrandonLWhite

+0

這一個工程,也請參閱http://stackoverflow.com/a/34386471/404615 –

0

不幸的是,對於此示例而言,將兩個正斜槓並不按預期工作。

rsync -rvztn --delete --exclude="/application/logs/" ...

我想「rsync的」只在/應用程序,以排除文件/日誌是在頂層,因此領先的斜線。添加兩個正斜槓不會導致它排除此目錄。我不得不求助於不太準確的--exclude="application/logs/"

+0

請參閱http://stackoverflow.com/a/34386471/404615 –

36

還有is a way可通過在Windows Git MSys中設置MSYS_NO_PATHCONV=1MSYS2中的MSYS2_ARG_CONV_EXCL="*"來抑制路徑轉換。

或者,您也可以通過將只是自身命令之前分配只是暫時設置的變量只是該命令:

MSYS_NO_PATHCONV=1 arm-none-linux-gnueabi-gcc.exe -Wall -g \ 
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \ 
    -Wl,-rpath=/usr/lib/myrpath \ 
    -I../targetsysroot/usr/include \ 
    myprogram.c -o myprogram 
+8

這是不正確的。這[[只添加到Git窗口的MSYS運行時分支](https://github.com/git-for-windows/msys2-runtime/pull/11),而'MSYS_NO_PATHCONV'變量不是**識別的由上游版本的MSYS:不是1.0,而不是MSYS2,不是32或64位變體。 –

+0

這非常棒。我希望它始終可用。感謝您指出。 – xer0x

+0

'MSYS2_ARG_CONV_EXC =「*」'被上游的MSYS2接受,並且執行相同的操作。它記錄在https://sourceforge.net/p/msys2/wiki/Porting/這裏 – Phyx