Thêm thư viện bên ngoài vào dự án Qt Creator


112

Làm cách nào để thêm thư viện bên ngoài vào một dự án được xây dựng bởi Qt Creator RC1 (phiên bản 0.9.2)? Ví dụ, hàm win32 EnumProcesses()yêu cầu Psapi.libđược thêm vào dự án để xây dựng.

Câu trả lời:


216

Cách thích hợp để làm điều này là như sau:

LIBS += -L/path/to -lpsapi

Bằng cách này, nó sẽ hoạt động trên tất cả các nền tảng được Qt hỗ trợ. Ý tưởng là bạn phải tách thư mục khỏi tên thư viện (không có phần mở rộng và không có bất kỳ tiền tố 'lib' nào). Tất nhiên, nếu bạn đang bao gồm một lib cụ thể của Windows, điều này thực sự không quan trọng.

Trong trường hợp bạn muốn lưu trữ các tệp lib của mình trong thư mục dự án, bạn có thể tham chiếu chúng bằng $$_PRO_FILE_PWD_biến, ví dụ:

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi

2
Có thể chỉ định một biến môi trường làm đường dẫn thư viện không? Tôi đang hỏi vì việc viết tên đường dẫn được mã hóa cứng vào tệp .pro sẽ phá vỡ mọi thứ nếu một dự án được phát triển bởi nhiều người có thể không cài đặt tất cả các thư viện ở cùng một vị trí.
trước

Điều này đã làm việc cho tôi, nhưng khi tôi tạo một dự án vs qmake -tp vc, tôi không tìm thấy tên libs nào trong Additional Dependenciesdự án, nhưng dự án vs vẫn chạy tốt. Có nghĩa là có một số phương pháp khác để thêm Additional Dependenciesvào vs?
CN mùa hè,

1
Tôi không nghĩ bạn cần chỉ định đường dẫn cho thư viện Windows tích hợp sẵn. File .pro của chúng tôi có những dòng như thế này trong phần win32: LIBS += -lGdi32.
Dan Korn

1
Như @DanKorn đã lưu ý, đối với các thư viện Windows tích hợp sẵn, bạn không cần (và không nên) chỉ định một đường dẫn.
bur

Tại sao họ không thể chỉ tạo GUI để thêm thư viện smh.
GeneCode

24

Bạn đang sử dụng qmakecác dự án? Nếu vậy, bạn có thể thêm một thư viện bên ngoài bằng cách sử dụng LIBSbiến. Ví dụ:

win32:LIBS += path/to/Psapi.lib

1
Xin lỗi vì câu hỏi khập khiễng, nhưng thư viện psapi nên được tạo sẵn hay QtCreator sẽ lo việc xây dựng nó?
Dfr,

11

LIBS + = C: \ Program Files \ OpenCV \ lib

sẽ không hoạt động vì bạn đang sử dụng khoảng trắng trong Tệp chương trình. Trong trường hợp này, bạn phải thêm dấu ngoặc kép, vì vậy kết quả sẽ như sau: LIBS + = "C: \ Program Files \ OpenCV \ lib" . Tôi khuyên bạn nên đặt thư viện ở các vị trí không có khoảng trắng ;-)


Các phiên bản mới nhất của Qt (Creator) luôn muốn các dấu gạch chéo về phía trước (đơn) làm dấu phân tách thư mục. Ngoại lệ duy nhất là khi bạn sử dụng lệnh "hệ thống" trong Windows. Sau đó, bạn cần cung cấp cho hệ thống một dấu gạch chéo lùi đã thoát, nghĩa là hai dấu gạch chéo ngược. Để thay thế tất cả các dấu gạch chéo với hai dấu gạch chéo ngược có thể được thực hiện như sau: WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

Lỗi ý bạn là do thiếu đường dẫn bao gồm bổ sung. Hãy thử thêm nó bằng: INCLUDEPATH + = C: \ path \ to \ include \ files \ Hy vọng nó hoạt động. Trân trọng.


4

Và để thêm nhiều tệp thư viện, bạn có thể viết như sau:

INCLUDEPATH * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Common E: / DebugLibrary / VTK / Filtering E: / DebugLibrary / VTK / GenericFiltering E: / DebugLibrary / VTK / Graphics E: / DebugLibrary / VTK / GUISu Qt E: / DebugLibrary / VTK / Hybrid E: / DebugLibrary / VTK / Imaging E: / DebugLibrary / VTK / IO E: / DebugLibrary / VTK / Parallel E: / DebugLibrary / VTK / Rendering E: / DebugLibrary / VTK / Utilities E : / DebugLibrary / VTK / VolumeRendering E: / DebugLibrary / VTK / Widgets E: / DebugLibrary / VTK / Wrapping

Libs * = -le: / DebugLibrary / VTKBin / bin / phát hành -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering


3

Nếu bạn muốn triển khai ứng dụng của mình trên máy của khách hàng, thay vì chỉ sử dụng ứng dụng của bạn, chúng tôi thấy rằng LIBS+= -Lxxx -lyyyphương pháp này có thể dẫn đến nhầm lẫn nếu không muốn nói là các vấn đề.

Chúng tôi phát triển các ứng dụng cho Linux, Mac và Windows bằng Qt. Chúng tôi gửi các ứng dụng hoàn chỉnh, độc lập. Vì vậy, tất cả các thư viện không thuộc hệ thống nên được bao gồm trong gói triển khai. Chúng tôi muốn khách hàng của mình có thể chạy ứng dụng từ cùng một thẻ USB cho tất cả các hệ điều hành. Vì lý do tương thích với nền tảng, thanh USB sau đó phải được định dạng là FAT32, không hỗ trợ các liên kết tượng trưng (Linux).

Chúng tôi tìm thấy LIBS+= -Lxxx -lyyythành ngữ quá nhiều về hộp đen:

  1. Chúng tôi không biết chính xác đường dẫn tệp của thư viện (tĩnh hoặc động) đã được trình liên kết tìm thấy. Điều này thật bất tiện. Trình liên kết Mac của chúng tôi thường xuyên tìm thấy các lib khác với những libs mà chúng tôi nghĩ rằng nên được sử dụng. Điều này đã xảy ra vài lần với các thư viện OpenSSL nơi trình liên kết Mac đã tìm thấy và sử dụng phiên bản OpenSSL của chính nó - cũ hơn, không tương thích - hơn là phiên bản chúng tôi yêu cầu.

  2. Chúng tôi không thể để trình liên kết sử dụng liên kết tượng trưng cho các thư viện vì điều này sẽ phá vỡ gói triển khai.

  3. Chúng tôi muốn xem từ tên của thư viện xem chúng tôi liên kết thư viện tĩnh hay động.

Vì vậy, đối với trường hợp cụ thể của chúng tôi, chúng tôi chỉ sử dụng các đường dẫn tệp tuyệt đối và kiểm tra xem chúng có tồn tại hay không. Chúng tôi xóa tất cả các liên kết tượng trưng.

Đầu tiên, chúng tôi tìm hiểu xem chúng tôi đang sử dụng hệ điều hành nào và đặt nó vào biến CONFIG. Và, ví dụ đối với Linux 64bit, thì:

linux64 {
    LIBSSL= $$OPENSSLPATH/linux64/lib/libssl.a
    !exists($$LIBSSL): error ("Not existing $$LIBSSL")
    LIBS+= $$LIBSSL
    LIBCRYPTO= $$OPENSSLPATH/linux64/lib/libcrypto.a
    !exists($$LIBCRYPTO): error ("Not existing $$LIBCRYPTO")
    LIBS+= $$LIBCRYPTO
}

Tất cả các phần phụ thuộc có thể được sao chép vào gói triển khai như chúng ta biết đường dẫn tệp của chúng.


1

Tôi muốn thêm vào vì lợi ích của sự hoàn chỉnh rằng bạn cũng có thể chỉ thêm LIBRARY PATH nơi nó sẽ tìm kiếm một thư viện phụ thuộc (có thể không được tham chiếu trực tiếp trong mã của bạn nhưng một thư viện bạn sử dụng có thể cần nó).

Để so sánh, điều này sẽ tương ứng với những gì môi trường LIBPATH thực hiện nhưng loại nó bị che khuất trong Qt Creator và không được ghi chép đầy đủ.

Cách tôi đến đây là sau:

LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"

Về cơ bản, nếu bạn không cung cấp tên thư viện thực, nó sẽ thêm đường dẫn đến nơi nó sẽ tìm kiếm các thư viện phụ thuộc. Sự khác biệt về cú pháp là nhỏ nhưng điều này rất hữu ích để chỉ cung cấp PATH nơi tìm kiếm các thư viện phụ thuộc. Đôi khi thật khó khăn khi cung cấp từng thư viện riêng lẻ cho từng đường dẫn nơi bạn biết tất cả chúng đều nằm trong một thư mục nhất định và Qt Creator sẽ chọn chúng.


0

trong .pro: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

trong .h / .cpp: #pragma comment(lib,"user32.lib")

#pragma comment(lib,"psapi.lib")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.