2009-04-05 107 views

Trả lời

196

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

LIBS += -L/path/to -lpsapi 

Bằng cách này nó sẽ làm việc trên tất cả các nền tảng được hỗ trợ bởi Qt. Ý 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ó tiền tố 'lib'). 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ữ file lib của bạn trong thư mục dự án, bạn có thể tham khảo chúng với biến $$_PRO_FILE_PWD_, ví dụ:

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

Đây là câu trả lời đúng cho bài đăng này. – sivabudh

+3

+1 bởi vì nó xem xét giải pháp nền tảng chéo, câu trả lời hoàn chỉnh nhất. – morde

+2

Có thể chỉ định biến môi trường làm đường dẫn thư viện không? Tôi hỏi vì viết tên đường dẫn 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ó tất cả các thư viện được cài đặt trong cùng một vị trí. – antred

20

Bạn đang sử dụng qmake dự án? Nếu có, bạn có thể thêm thư viện bên ngoài bằng biến số LIBS. Ví dụ:

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

Xin lỗi vì câu hỏi lame, nhưng thư viện psapi nên đã được dựng sẵn hay QtCreator sẽ xử lý nó? – Dfr

5

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

10

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, do đó kết quả sẽ trông như sau: LIBS + = "C: \ Program Files \ OpenCV \ lib". Tôi khuyên bạn nên thư viện đặt tại các địa điểm không trắng không gian ;-)

+0

Các phiên bản mới nhất của Qt (Creator) luôn luôn muốn (duy nhất) chuyển tiếp slashes như phân cá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 phải ăn hệ thống một dấu gạch chéo ngược thoát, đó là để nói hai dấu gạch chéo ngược. Để thay thế tất cả các dấu gạch chéo về phía trước 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

3

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

INCLUDEPATH * = E:/DebugLibrary/VTK E:/DebugLibrary/VTK/Common E:/DebugLibrary/VTK/Lọc E:/DebugLibrary/VTK/GenericFiltering E:/DebugLibrary/VTK/Đồ họa E:/DebugLibrary/VTK/GUISupport/Qt E:/DebugLibrary/VTK/Hybrid E:/DebugLibrary/VTK/Imaging E:/DebugLibrary/VTK/IO E:/DebugLibrary/VTK/Song song E:/DebugLibrary/VTK/Rendering E:/DebugLibrary/VTK/Tiện ích E:/DebugLibrary/VTK/VolumeRendering E:/DebugLibrary/VTK/Widgets E:/DebugLibrary/VTK/Bao bì

libs * = -le:/DebugLibrary/VTKBin/bin/release -lvtkCommon -lvtksys - lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering

1

Nếu bạn muốn để triển khai ứng dụng của bạn 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 phương pháp LIBS+= -Lxxx -lyyy có thể dẫn đến nhầm lẫn nếu không phải 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 phải 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 thanh USB cho tất cả các hệ điều hành. Vì lý do tương thích 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 mềm (Linux).

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

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

  2. Chúng tôi không thể đủ khả năng rằng trình liên kết sử dụng liên kết tượng trưng đến 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 cho dù 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 filepath 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.

Trước tiên, chúng tôi tìm hiểu hệ điều hành nào chúng tôi đang sử dụng và đặt điều này vào biến CONFIG. Và, ví dụ cho Linux 64bit, sau đó:

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ụ thuộc có thể được sao chép vào gói triển khai như chúng ta biết tệp của chúng.

0

Tôi muốn thêm vào các gói đầy đủ mà bạn cũng có thể thêm LIBRARY PATH nơi nó sẽ tìm 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 thư viện bạn sử dụng có thể cần) .

Để so sánh, điều này sẽ tương ứng với môi trường LIBPATH nhưng loại tối nghĩa trong Qt Creator và không được ghi lại tài liệu.

The way i đến xung quanh này là như 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 tế, nó bổ sung thêm đường dẫn đến nơi nó sẽ tìm kiếm 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 để tìm thư viện phụ thuộc. Nó đôi khi chỉ là một nỗi đau để cung cấp mỗi đường dẫn thư viện cá nhân, nơi bạn biết họ là tất cả trong thư mục nhất định và Qt Creator sẽ chọn chúng lên.

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