2011-07-21 23 views
10

Tôi đã tạo chương trình bằng cách sử dụng Qt Creator 2.2.1 và Qt 4.7.4 (32 bit) có đầu ra là tệp thực thi. Mở exe sử dụng DependencyWalker nó cho thấy rằng exe sử dụng DLL sau:Tự động sao chép các tệp phụ thuộc trong Qt Creator

  • kernel32.dll
  • MSVCRT.DLL
  • MINGWM10.DLL
  • LIBGCC_S_DW2-1.DLL
  • QTCORE4.DLL
  • QTGUI4.DLL

Tôi muốn sau khi xây dựng tất cả tệp phụ thuộc (có thể khác trong một số dự án khác) ngoại trừ các tệp cụ thể của Windows (hai tệp đầu tiên trong danh sách ở trên) sẽ được tự động sao chép vào thư mục có vị trí exe.

Tôi làm cách nào để thực hiện trong Qt Creator hoặc hệ thống Qt mà không cần sử dụng kịch bản dòng lệnh? Cảm ơn.

Trả lời

11

Trong QT 5.3, bạn có thể sử dụng công cụ qq windeployqt để tự động sao chép các thư viện cần thiết.

Các bổ sung sau vào tệp .pro của dự án nên thực hiện thủ thuật, nhưng bạn có thể phải thực hiện một số điều chỉnh dựa trên tình huống cụ thể của bạn.

isEmpty(TARGET_EXT) { 
    win32 { 
     TARGET_CUSTOM_EXT = .exe 
    } 
    macx { 
     TARGET_CUSTOM_EXT = .app 
    } 
} else { 
    TARGET_CUSTOM_EXT = $${TARGET_EXT} 
} 

win32 { 
    DEPLOY_COMMAND = windeployqt 
} 
macx { 
    DEPLOY_COMMAND = macdeployqt 
} 

CONFIG(debug, debug|release) { 
    # debug 
    DEPLOY_TARGET = $$shell_quote($$shell_path($${OUT_PWD}/debug/$${TARGET}$${TARGET_CUSTOM_EXT})) 
} else { 
    # release 
    DEPLOY_TARGET = $$shell_quote($$shell_path($${OUT_PWD}/release/$${TARGET}$${TARGET_CUSTOM_EXT})) 
} 

# # Uncomment the following line to help debug the deploy command when running qmake 
# warning($${DEPLOY_COMMAND} $${DEPLOY_TARGET}) 

# Use += instead of = if you use multiple QMAKE_POST_LINKs 
QMAKE_POST_LINK = $${DEPLOY_COMMAND} $${DEPLOY_TARGET} 
+0

Cảm ơn bạn đã cho tôi biết về tính năng này. :) – Donotalo

+1

Hãy cẩn thận khi sử dụng. Bạn có thể bị cám dỗ để loại bỏ chức năng báo giá/đường dẫn của trình bao, nhưng bạn thực sự không muốn làm điều đó. Qt thích sử dụng kiểu dấu gạch chéo hơn. Nó có thể làm cho mã của bạn trông lộn xộn và xấu xí, nhưng nó có giá trị an toàn boilerplate. –

+0

Cảm ơn nó hoạt động. Nhưng có cách nào để có được "làm sạch" loại bỏ các tập tin cụ thể bản sao này? Tôi đoán tôi có thể loại bỏ toàn bộ thư mục của khóa học - chỉ cần tự hỏi nếu có bất kỳ cách tiếp cận khác. – Zitrax

5

Tôi sẽ sửa đổi tệp * .pro của bạn cho dự án và sử dụng INSTALLS. Để thực sự khiến các tệp được di chuyển, bạn sẽ cần chạy make install. Trong Qt Creator, bạn có thể thêm nó như là một phần của quá trình xây dựng thông thường của bạn bằng cách đi sâu vào phần "Projects" và thêm bước xây dựng mới.

## This sets MY_LIB_FILES the libs you want and should also correctly resolve 
## the location of the libs. 

win32 {    ## For Windows builds 
    # Note: Check to make sure of file name case 

    MY_LIB_FILES += $$QMAKE_LIBDIR_QT/MINGWM10.DLL 
    MY_LIB_FILES += $$QMAKE_LIBDIR_QT/LIBGCC_S_DW2-1.DLL 
    MY_LIB_FILES += $$QMAKE_LIBDIR_QT/QTCORE4.DLL 
    MY_LIB_FILES += $$QMAKE_LIBDIR_QT/QTGUI4.DLL 
} 

unix {      ## For unix builds 
    # MY_LIB_FILES += $$QMAKE_LIBDIR_QT/...xxxxxx.... 
} 

## Define what files are 'extra_libs' and where to put them 
extra_libs.files = MY_LIB_FILES 
extra_libs.path = $$DESTDIR 

## Tell qmake to add the moving of them to the 'install' target 
INSTALLS += extra_libs 
+0

Tôi nghĩ rằng phần phức tạp của câu hỏi của anh ta là làm điều này ** tự động ** liên quan đến ** tệp phụ thuộc ** ... – vrince

+0

@vrince: ít nhất nó sẽ giải quyết được một phần vấn đề của tôi. – Donotalo

+0

Tôi không thể làm cho nó hoạt động. Thay thế 'make install' trong Windows 7 Ultimate là gì? – Donotalo

4

Mặc dù không hoàn toàn tự động, bạn có thể với ít nỗ lực làm những gì bạn muốn với QtCreator.

Thêm các "INSTALLS" chỉ thị để dự án của bạn (.pro) tập tin (tương tự như những gì đã được đề xuất bởi jwernerny):

win32 { 
    libstocopy.files = $$QMAKE_LIBDIR_QT/MINGWM10.DLL \ 
     ... (add other files) 
} 

# If using MSVC the code may end up in "release" or "debug" sub dir 
# Remove this if that is not the case 
win32 { 
    CONFIG(debug, debug|release): OUTDIR = debug 
    else: OUTDIR = release 
} 

libstocopy.path = $$OUT_PWD/$$OUTDIR 
INSTALLS += libstocopy 

Trong mục "Dự án" tab của QtCreator (phiên bản của tôi = 2.4.1) bây giờ bạn bổ sung thêm một build bước:

  • Hit "Add build bước"
  • Chọn "Make"
  • Để lại "Override ..." trống rỗng
  • Nhập "cài đặt" tại "Tạo đối số:"

Vì các cài đặt này không được lưu với tệp dự án của bạn, bạn phải thực hiện phần thứ hai (Thêm bước xây dựng) mỗi khi bạn tạo cấu hình xây dựng mới (ví dụ: mỗi bản phát hành và gỡ lỗi) hoặc xem dự án của bạn đến một vị trí mới.

-1

Không-no-no 0_o :)

  1. Tạo một số thư mục để triển khai tác phẩm, tức là "bin".
  2. Trong mọi.pro tập tin ghi

    DLLDESTDIR = ../../myproject/bin (... của một số dir struct ...)

    QMAKE_POST_LINK = windeployqt --compiler-runtime $$ DLLDESTDIR

DLLDESTDIR - đường dẫn đầy đủ với tên tệp TARGET (dll và exe).

Kết thúc!

+0

Bạn có thể thêm một số giải thích về lý do tại sao họ nên làm điều này. –

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