Làm cách nào để sử dụng tệp DLL của bên thứ ba trong Visual Studio C ++?


76

Tôi hiểu rằng tôi cần sử dụng LoadLibrary (). Nhưng tôi cần thực hiện các bước nào khác để sử dụng tệp DLL của bên thứ ba?

Tôi chỉ đơn giản là nhảy vào C ++ và đây là phần duy nhất mà tôi không nhận được (với tư cách là một lập trình viên Java). Tôi chỉ đang tìm cách sử dụng Thư viện Qt và tesseract-ocr, nhưng quá trình này không có ý nghĩa gì đối với tôi và rất khó để google.

Làm cách nào để cho trình biên dịch biết các hàm mà tôi đang sử dụng? Có nên có tệp bao gồm từ nhà cung cấp bên thứ ba không?


Bạn có hiểu cách thêm tệp dll của bên thứ ba trong visual studio 2012 cho C ++ không. Xin hãy giúp tôi với.
afzalex

Câu trả lời:


72

Như mọi người đã nói, LoadLibrary là một cách khó để làm điều đó và hầu như không cần thiết.

DLL phải đi kèm với tệp .lib để liên kết và một hoặc nhiều tệp tiêu đề để #include vào nguồn của bạn. Các tệp tiêu đề sẽ xác định các lớp và nguyên mẫu hàm mà bạn có thể sử dụng từ DLL. Bạn sẽ cần điều này ngay cả khi bạn sử dụng LoadLibrary.

Để liên kết với thư viện, bạn có thể phải thêm tệp .lib vào cấu hình dự án trong Trình liên kết / Đầu vào / Phụ thuộc Bổ sung.


1
Cảm ơn, các câu trả lời khác rất tốt (và cũng hữu ích cho tôi) nhưng điều này giải thích chính xác những gì tôi đang tìm kiếm.
Zombies

Hộp thoại 'phụ thuộc bổ sung' có vẻ như nó chỉ hỗ trợ tên tệp và phần mở rộng, không hỗ trợ đường dẫn tệp. Việc thêm tên tệp + phần mở rộng không khắc phục được lỗi 'không tìm thấy mã nhận dạng'. Thêm đường dẫn đủ điều kiện + tên tệp + cũng không khắc phục được chúng.
anon58192932

1
@advocate, có một mục nhập cho "Thư mục Thư viện Bổ sung" trên tab "Chung". Tôi không biết tại sao Microsoft lại tách chúng ra.
Mark Ransom

Tôi thực sự đã làm điều này, nhưng tôi vẫn gặp lỗi Trình liên kết. Tôi đã đặt tệp .dll vào C: / Windows của mình. Tôi đang làm gì sai?
Bart

1
@darkgaze bạn có thể sử dụng #importđể tự động tạo và bao gồm tệp tiêu đề cho một DLL. Trình biên dịch cần biết khai báo của tất cả các chức năng để có thể xây dựng mã gọi.
Mark Ransom

67

Để kết hợp các tệp DLL của bên thứ ba vào dự án VS 2008 C ++ của tôi, tôi đã làm như sau (bạn có thể dịch sang 2010, 2012, v.v.) ...

Tôi đặt các tệp tiêu đề trong giải pháp của mình cùng với các tệp tiêu đề khác của tôi, thực hiện các thay đổi đối với mã của tôi để gọi các chức năng của DLL (nếu không thì tại sao chúng tôi lại làm tất cả điều này?). : ^) Sau đó, tôi đã thay đổi bản dựng để liên kết mã LIB với EXE của mình, để sao chép các tệp DLL vào đúng vị trí và để dọn dẹp chúng khi tôi thực hiện 'sạch' - tôi giải thích những thay đổi này bên dưới.

Giả sử bạn có 2 tệp DLL của bên thứ ba, A.DLL và B.DLL và bạn có tệp LIB sơ khai cho mỗi tệp (A.LIB và B.LIB) và tệp tiêu đề (AH và BH).

  • Tạo thư mục "lib" trong thư mục giải pháp của bạn, ví dụ: sử dụng Windows Explorer.
  • Sao chép các tệp .LIB và .DLL của bên thứ ba của bạn vào thư mục này

(Bạn sẽ phải thực hiện tập hợp thay đổi tiếp theo một lần cho mỗi mục tiêu tạo nguồn mà bạn sử dụng (Gỡ lỗi, Phát hành).)

  1. Làm cho EXE của bạn phụ thuộc vào các tệp LIB

    • Đi tới Thuộc tính cấu hình -> Trình liên kết -> Đầu vào -> Phụ thuộc bổ sung và liệt kê các tệp .LIB của bạn ở đó từng tệp một, được phân tách bằng dấu cách : A.LIB B.LIB
    • Đi tới Thuộc tính cấu hình -> Chung -> Thư mục Thư viện Bổ sung, và thêm thư mục "lib" của bạn vào bất kỳ thư mục nào bạn đã có ở đó. Các mục được phân tách bằng dấu chấm phẩy . Ví dụ: nếu bạn đã có $(SolutionDir)fodderở đó, bạn thay đổi nó thành $(SolutionDir)fodder;$(SolutionDir)libđể thêm "lib".
  2. Buộc các tệp DLL được sao chép vào thư mục đầu ra

    • Đi tới Thuộc tính cấu hình -> Tạo sự kiện -> Hậu tạo sự kiện
    • Đặt phần sau cho Dòng lệnh (để biết ý nghĩa của công tắc, hãy xem "XCOPY /?" Trong cửa sổ DOS):

    XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y

    • Bạn có thể đặt một cái gì đó như thế này cho Mô tả:

    Copy DLLs to Target Directory

    • Bị loại trừ khỏi bản dựng nên được No. Bấm vào OK.
  3. Yêu cầu VS dọn dẹp các tệp DLL khi nó dọn dẹp một thư mục đầu ra:

    • Đi tới Thuộc tính cấu hình -> Chung -> Tiện ích mở rộng để Xóa trên Sạch, và nhấp vào "..."; thêm *.dllvào cuối danh sách và nhấp vào OK.

2
Tôi đang cố gắng sử dụng phương pháp của bạn để sử dụng dll của bên thứ ba. Tôi đang sử dụng Visual studio 2012 cuối cùng và Nó không có Additional Library Directoriestrong Configuration Properties -> Generaltab. Làm ơn giúp tôi.
afzalex

6
Điều đó nên được Configuration Properties -> Linker -> General -> Additional Library Directories.
Colin Robertson,

@afzalex bạn có thể tìm thấy điều đó trong Thuộc tính cấu hình> Thư mục VC ++> Thư mục thư viện. Đó là một sự thay đổi thế hệ;)
Bokhari

Một trích dẫn không được đặt cho bước 2. Sử dụng:XCOPY "$(SolutionDir)\lib\*.DLL" "$(TargetDir)" /D /K /Y
Tristan CHARBONNIER

@TristanCHARBONNIER Thật thú vị. Tôi khá chắc rằng mình đã sao chép / dán XCOPYlệnh từ cấu hình làm việc của mình. Bạn đang nói rằng báo giá được đặt sai vị trí vì nó không phù hợp với bạn, hay đó chỉ là suy đoán?
rich p

24

Đây là hai cách sử dụng tệp DLL trong Windows:

  1. Có một thư viện sơ khai (.lib) với các tệp tiêu đề được liên kết. Khi bạn liên kết tệp thực thi của mình với tệp lib, nó sẽ tự động tải tệp DLL khi khởi động chương trình.

  2. Đang tải DLL theo cách thủ công. Đây thường là những gì bạn muốn làm nếu bạn đang phát triển một hệ thống plugin trong đó có nhiều tệp DLL triển khai một giao diện chung. Kiểm tra tài liệu cho LoadLibraryGetProcAddress để biết thêm thông tin về điều này.

Đối với Qt, tôi nghi ngờ rằng có sẵn các tiêu đề và một thư viện tĩnh mà bạn có thể đưa vào và liên kết trong dự án của mình.


Và có một cách thứ ba, tương tự như cách đầu tiên của bạn, sử dụng công /MTtắc, sẽ liên kết tĩnh các thư viện của bạn. Ưu điểm là không có chi phí liên kết động . Tuy nhiên, điều này không thể được sử dụng nếu bạn cũng sử dụng công /clrtắc.
Abel

2
Điều đó chỉ áp dụng cho thư viện tiêu chuẩn. Đối với các Thư viện tùy chỉnh (bên thứ ba), bạn không thể liên kết tĩnh một dll trừ khi ai đó đã xây dựng một cách rõ ràng phiên bản tĩnh của nó mà bạn có thể liên kết.
Laserallan

@Laserallan Tôi đang phát triển một dự án DLL nhưng khi tôi xây dựng nó, nó chỉ là tạo tệp dlllib. nó không tạo một includesthư mục. làm cách nào để đưa các tệp tiêu đề của tôi vào dự án?
mrid

Thư viện dll / import là đầu ra của trình liên kết. Khi nói đến việc cung cấp bao gồm, bạn cần đảm bảo rằng tất cả được phân phối cùng nhau. Làm thế nào bạn làm điều này tùy thuộc vào hệ thống xây dựng của bạn nhưng nếu sử dụng cmake, nhìn vào cài đặt gia đình của lệnh này sẽ giúp bạn quyết định lên các tập tin quan trọng để phân phối một cách có cấu trúc
Laserallan

6

Để sử dụng Qt với động liên kết bạn phải xác định libtập tin (thường qtmaind.lib, QtCored4.libQtGuid4.libcho "Debug" configration) trong
Properties » Linker » Input » Additional Dependencies.

Bạn cũng phải chỉ định đường dẫn mà các lib đang ở , cụ thể là trong
Properties » Linker » General » Additional Library Directories.

Và bạn cần làm cho các .dlltệp tương ứng có thể truy cập được trong thời gian chạy, bằng cách lưu trữ chúng trong cùng thư mục với của bạn .exehoặc trong một thư mục nằm trên đường dẫn của bạn .


3

Bạn chỉ cần sử dụng LoadLibrary nếu bạn muốn kết thúc trễ và chỉ giải quyết các chức năng đã nhập trong thời gian chạy. Cách dễ nhất để sử dụng dll của bên thứ ba là liên kết với .lib.


Trả lời chỉnh sửa của bạn:

Có, API của bên thứ ba phải bao gồm một dll và / hoặc một lib chứa các tệp triển khai và tiêu đề khai báo các loại bắt buộc. Bạn cần biết định nghĩa kiểu cho dù bạn sử dụng phương pháp nào - đối với LoadLibrary, bạn sẽ cần xác định con trỏ hàm, vì vậy bạn có thể dễ dàng viết tệp tiêu đề của riêng mình. Về cơ bản, bạn chỉ cần sử dụng LoadLibrary nếu bạn muốn ràng buộc muộn. Một lý do hợp lệ cho điều này là nếu bạn không chắc liệu dll sẽ có sẵn trên PC mục tiêu hay không.


2

Nếu bạn được cho là có thể sử dụng nó, thì thư viện của bên thứ 3 phải có tệp * .lib cũng như tệp * .dll. Bạn chỉ cần thêm * .lib vào danh sách tệp đầu vào trong các tùy chọn 'Trình liên kết' của dự án.

Tệp * .lib này không nhất thiết phải là thư viện 'tĩnh' (chứa mã): thay vào đó, * .lib có thể chỉ là một tệp liên kết tệp thực thi của bạn với DLL.

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.