2013-02-18 23 views
5

Có cách nào để lấy đường dẫn kiểu cửa sổ vào thư mục chứa .pro hoặc chuyển đổi những gì được lưu trữ trong _PRO_FILE_PWD_ sang đường dẫn kiểu Windows?Chuyển đổi đường dẫn Unix sang cửa sổ trong QMake Script


Tôi gặp sự cố với _PRO_FILE_PWD_ biến trong qmake nơi nó trả về một con đường unix phong cách trên cửa sổ.

ví dụ c:/foo/bar thay vì c:\foo\bar

này được chứng minh một vấn đề mà con đường đang được sử dụng như một phần của một bước post link.

QMAKE_POST_LINK += copy /y $$[QT_INSTALL_BINS]\\QtCore4.dll $${_PRO_FILE_PWD_}/bin/; 

tôi sử dụng các tập tin .pro để tạo ra một dự án Visual Studio và tôi có thể thấy rằng nếu tôi tự thay đổi các dấu gạch chéo để sao chéo trong VS rằng tất cả mọi thứ được sao chép tốt mà không có bất kỳ lỗi nào.

Tôi gặp lỗi sau trong Visual Studio nếu tôi không sửa đường dẫn.

PostBuildEvent: 
1> Description: copy /y C:\Qt\4.8.3\bin\QtCore4.dll E:/foo/build/win32//bin//; 
1> The syntax of the command is incorrect. 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: The command "copy /y C:\Qt\4.8.3\bin\QtCore4.dll E:/foo/build/win32/bin/; 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: :VCEnd" exited with code 1. 

Giải pháp

Rất đơn giản giải pháp nhờ Roku bằng cách thêm dấu ngoặc kép trốn xung quanh con đường sử dụng/ký tự.

MAKE_POST_LINK += 
    copy /y $$[QT_INSTALL_BINS]\\QtCore4.dll \"$${_PRO_FILE_PWD_}/bin/\"; 

Lưu ý rằng việc thêm nhiều lệnh sao chép bạn phải tách chúng bằng ký hiệu và dấu chấm phẩy không hoạt động.

ví dụ:

MAKE_POST_LINK += 
     copy /y $$[QT_INSTALL_BINS]\\QtCore4.dll \"$${_PRO_FILE_PWD_}/bin/\" & 
    MAKE_POST_LINK += 
     copy /y $$[QT_INSTALL_BINS]\\QtGui4.dll \"$${_PRO_FILE_PWD_}/bin/\"; 
+0

Bạn có chắc chắn nhân vật/là vấn đề? Nó hoạt động hầu như ở khắp mọi nơi trong Windows. Bạn đã sao chép-dán dòng sao chép vào dấu nhắc lệnh và thử nó ở đó? Có thể là người cuối cùng; là vấn đề? –

+0

@Roku Tôi vừa thử trên dấu nhắc lệnh .. Nó không hoạt động với/only \. Các ; Có bởi vì tôi có một vài lệnh sao chép .. Tôi đã thử mà không có ... – volting

Trả lời

0

tôi đã làm việc này bằng cách thêm thoát ngoặc kép quanh con đường sử dụng/nhân vật:

QMAKE_POST_LINK += 
    copy /y $$[QT_INSTALL_BINS]\\QtCore4.dll \"$${_PRO_FILE_PWD_}/bin/\"; 
+0

Cảm ơn Roku vì đã tìm ra một giải pháp rất đơn giản! Lưu ý dấu chấm phẩy không hoạt động để tách nhiều lệnh - Tôi đã phải sử dụng dấu và. – volting

+1

Giải pháp này không phải là crossplateform: bạn nên thích câu trả lời @edwinc sử dụng $$ shell_path() –

+0

Nó cũng không hoạt động khi đường dẫn nguồn sử dụng dấu gạch chéo về phía trước. Đã thêm giải pháp cho Qt4 – AntonyG

10

$$shell_path() sẽ chuyển đổi các dấu gạch chéo sang định dạng hệ thống địa phương, vì vậy:

QMAKE_POST_LINK += copy /y "$$shell_path($$QT_INSTALL_BINS/QtCore4.dll)" "$$shell_path($$_PROD_FILE_PWD_/bin)" 
+0

làm việc cho tôi khi giành chiến thắng 8/Qt 5.4 Cảm ơn! Bạn cũng có thể gọi '$$ QMAKE_COPY' thay cho' copy/y' được thay thế bằng phiên bản độc lập của bản sao. – amenthes

3

Oddly đủ, thoát khỏi dấu ngoặc kép hoạt động cho tệp đích nhưng không phải là nguồn.

ví dụ: công trình này:

copy C:\dev\playground\qt\SampleProject\debug_qt.conf "C:/dev/playground/qt/build-SampleProject-Qt_8_4_6_Desktop-Debug/qt.conf" 

nhưng điều này không:

copy "C:/dev/playground/qt/SampleProject/debug_qt.conf" "C:/dev/playground/qt/build-SampleProject-Qt_8_4_6_Desktop-Debug/qt.conf" 

Như đã lưu ý, $$shell_path(path) công trình thuộc Qt5.

Trên Qt4, $$replace(string, old_string, new_string) có thể được sử dụng thay thế.

Ví dụ:

MY_PATH = $$PWD 
message($$replace(MY_PATH, /, \\)) 
+0

Tuyệt vời. Cảm ơn bạn đã đặt cả hai giải pháp qt4 và qt5 ở đó. – macetw

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