2013-02-26 39 views
7

Tôi có một tệp foo.h có các khai báo khác nhau cho các hàm. Tất cả các chức năng này được thực hiện trong một tệp foo.dll. Tuy nhiên, khi tôi bao gồm các tập tin .h và cố gắng sử dụng bất kỳ chức năng, tôi nhận được lỗi:Làm cách nào để liên kết một DLL với dự án của tôi? lỗi LNK2019: biểu tượng bên ngoài chưa được giải quyết

bar.obj : error LNK2019: unresolved external symbol SomeFunction 

như vậy rõ ràng việc triển khai chức năng không được tìm thấy.

Tôi phải làm gì để giúp trình biên dịch tìm các định nghĩa trong tệp DLL và liên kết chúng với tệp .h?

Tôi đã xem một số nội dung về __declspec(dllexport)__declspec(dllimport) nhưng tôi vẫn không thể tìm ra cách sử dụng chúng.

+0

Bạn có đang liên kết tệp thực thi của mình với thư viện nhập 'foo.dll' (thường có tên' foo.lib') không? –

+0

Tôi mới làm điều này vì vậy tôi không thực sự chắc chắn cách thực hiện. Đó có phải là thuộc tính của studio trực quan cho dự án không? – xcdemon05

+1

@ xcdemon05, vâng, trong số các tùy chọn liên kết ở đó. –

Trả lời

8

Bạn nên nhận được ít nhất ba tập tin từ chủ sở hữu DLL. DLL mà bạn sẽ cần trong thời gian chạy, tệp .h với các khai báo của các hàm đã xuất, bạn đã có nó. Và một tệp .lib, thư viện nhập cho DLL. Trình liên kết nào yêu cầu để nó biết cách thêm các hàm vào bảng nhập của chương trình.

Bạn đang bỏ lỡ bước mà bạn đã nói với trình liên kết mà nó cần liên kết tệp .lib. Nó cần phải được thêm vào thiết lập Input + Additional Dependencies của liên kết của dự án của bạn. Hoặc dễ dàng nhất được thực hiện bằng cách viết hướng dẫn trình liên kết trong mã nguồn của bạn:

#include "foo.h" 
#pragma comment(lib, "foo.lib") 

Làm việc cho MSVC, không phải di động nhưng không bao giờ liên kết. Sao chép tệp .lib vào thư mục dự án của bạn hoặc chỉ định đường dẫn đầy đủ.

+0

Có sự khác biệt nào giữa việc sử dụng '#pragma comment' và thêm tệp lib vào' Thuộc tính dự án> Trình liên kết> Đầu vào' không? – Nitay

+1

Không có sự khác biệt, bạn chỉ đơn giản là không thể quên thay đổi cài đặt đó. –

3
  1. Bạn cần phải xác định trước định nghĩa hàm __declspec (dllexport) từ khóa tại thời điểm xây dựng dll
  2. Bạn cần phải nhập khẩu hoặc tải các tập tin .dll vào bộ nhớ quá trình.
  3. Bạn cần lấy địa chỉ của hàm bạn muốn sử dụng từ dll đó.

Một số liên kết hữu ích để bắt đầu :: MSDN Documentation, SO, Random

6

Tôi vừa gặp sự cố tương tự. Giải pháp hóa ra là DLL là 64 bit và ứng dụng đơn giản sử dụng nó là 32. Tôi đã quên thay đổi nó thành x64 trong Trình quản lý cấu hình.

+2

Bạn vừa lưu lại ngày của tôi sau ba giờ tìm kiếm trên internet. – Dan

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