2011-08-30 16 views
24

Trên Windows, tôi đang biên dịch chéo chương trình cho ARM/Linux bằng bộ biên dịch chéo của CodeSourcery. Tôi sử dụng mysw msys làm thông dịch viên lệnh của tôi, và rất thường xuyên nó sẽ mangle đường dẫn và tên đường dẫn của tôi. Ví dụ, để xây dựng chương trình của tôi, tôi gọiLàm thế nào để dừng mingw và msys từ tên đường dẫn mangling được đưa ra tại dòng lệnh?

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 

Tất nhiên, tôi muốn /usr/lib/myrpath chèn đúng nguyên văn vào myprogram thực thi - mục tiêu ARM linux Tôi đang biên soạn cho không sử dụng mingw hoặc msys. Nhưng đây là những gì kết thúc vào đó:

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

Không chính xác những gì tôi muốn. Nếu tôi gọi gcc trên dòng lệnh cmd.exe một cách trực tiếp, tôi sẽ nhận được rpath đúng trong tệp thực thi. Nếu tôi gọi gcc trên dòng lệnh msys, tôi sẽ nhận được đường cắt xén. Nếu tôi gọi gcc với một Makefile được chạy với lệnh make từ dòng lệnh cmd.exe, tôi vẫn nhận được một đường dẫn bị xé (!)

Bất kỳ ý tưởng nào làm tôi có thể tắt hành vi phiền toái này?

Trả lời

5

Tôi không nghĩ có cách nào để tắt tính năng này. MSYS là một nhánh của phiên bản Cygwin cũ với một số tinh chỉnh nhằm cải thiện tích hợp Windows, nhờ đó bản dịch đường dẫn POSIX tự động khi gọi các chương trình Windows nguyên bản được cho là quan trọng nhất. Rắc rối với điều đó là không phải lúc nào cũng có thể nói liệu một đối số là một con đường hay cái gì đó khác, hay là, trong trường hợp này, đó là một con đường mà không nên dịch. Bản dịch được hướng dẫn bởi một set of heuristics.

Bạn có thể thử sử dụng MinGW thay vì MSYS tạo (có, chúng là những thứ khác nhau), là bản dựng Windows gốc mà không cần hỗ trợ và chuyển đổi đường dẫn POSIX. Cài đặt với mingw-get install mingw32-make và gọi là mingw32-make.

Hoặc bạn có thể dùng thử Cygwin, lý tưởng với một công cụ xây dựng Cygwin của chuỗi công cụ.

+0

Cảm ơn - đó là liên kết (heuristics) đã giúp tôi 'giả ra' mingw và có được con đường của tôi thông qua unmolested. –

+2

WRONG! Có một cách để chuyển đổi nếu TẮT. http://stackoverflow.com/a/34386471/404615 –

16

Tôi vừa phát hiện ra một mẹo nhỏ gọn để tránh MSYS/MinGW dịch đường dẫn cho bạn.

Nếu bạn sử dụng dấu gạch chéo kép để bắt đầu đường dẫn, thì MSYS sẽ không dịch đường dẫn sang định dạng DOS. Vì vậy, trong ví dụ OP của, công tắc -rpath nên được quy định như thế này:

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

cụ Tất cả Unix/Linux dường như để xử lý dấu gạch chéo giả mạo như vậy mà không có vấn đề gì, vì vậy mặc dù rPath của nhị phân của bạn sẽ bắt đầu với // usr/... Tôi nghĩ rằng bộ nạp sẽ làm điều đúng.

+6

Nó không hoạt động đối với tôi nhưng -rpath = "// usr \ lib \ myrpath" (với dấu ngoặc kép và dấu gạch chéo ngược cho đường dẫn) –

+0

Ngọt ngào! Thủ thuật này hoàn toàn phù hợp với tôi. Cảm ơn! – BrandonLWhite

+0

trang này hoạt động, cũng xem http://stackoverflow.com/a/34386471/404615 –

0

Thật không may khi đặt hai dấu gạch chéo về phía trước cho ví dụ này không hoạt động như mong đợi.

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

Tôi muốn 'rsync' để loại trừ các file chỉ/application/bản ghi mà là ở cấp cao nhất, vì thế hàng đầu dấu gạch chéo. Thêm hai dấu gạch chéo chuyển tiếp sẽ không làm cho nó loại trừ thư mục này. Tôi phải nghỉ đến số --exclude="application/logs/" kém chính xác hơn.

+0

xem http://stackoverflow.com/a/34386471/404615 –

36

is a way để chặn bản dịch đường dẫn bằng cách đặt MSYS_NO_PATHCONV=1 trong Windows Git MSys hoặc MSYS2_ARG_CONV_EXCL="*" trong MSYS2.

Ngoài ra, bạn có thể thiết lập các biến chỉ tạm thời chỉ cho lệnh đó bằng cách đặt sự phân công ngay trước khi lệnh riêng của mình:

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

Điều này không chính xác. Điều này [chỉ được thêm vào Git cho thời gian chạy MSYS của Window] (https://github.com/git-for-windows/msys2-runtime/pull/11) và biến 'MSYS_NO_PATHCONV' là ** không ** được nhận diện bởi các phiên bản thượng nguồn của MSYS: không 1.0, không MSYS2, không 32 và 64 bit biến thể. –

+0

Điều này thật tuyệt. Tôi ước nó luôn có sẵn. Cảm ơn đã chỉ ra điều đó. – xer0x

+0

'MSYS2_ARG_CONV_EXC =" * "' được chấp nhận bởi MSYS2 ngược dòng và thực hiện tương tự. Tài liệu được https://sourceforge.net/p/msys2/wiki/Porting/ tại đây – Phyx

Các vấn đề liên quan