2012-03-01 37 views
6

Đối với nền, tôi đã đi qua này porting một codebase Linux cỡ trung bình (biên dịch thành một khổng lồ .so) đến cửa sổ x64 (biên dịch thành một .dll). Tôi đã gặp rắc rối liên kết.Lỗi biểu tượng chưa được giải quyết trong DLL

Là một testcase tối thiểu, nếu tôi tạo một dự án Visual Studio từ các tập tin sau đây:

#include <Windows.h> 
#include <Dbghelp.h> 

void do_stuff(char const * s) 
{ 
    char buffer[4096]; 
    long int len = UnDecorateSymbolName(
    s, 
    buffer, 
    sizeof(buffer), 
    UNDNAME_COMPLETE); 
} 

Và tôi thiết lập các loại dự án để DLL và xây dựng nó, tôi nhận được một lỗi "LNK2001: Chưa giải quyết bên ngoài symbol __imp_UnDecorateSymbolName ". Tức là, tệp sẽ biên dịch đúng, nhưng không liên kết được thành một dll.

Tôi nghĩ mục tiêu là để dll của tôi liên kết với dbghelp.dll, đặc biệt là kể từ khi (ít nhất là trên hệ thống của tôi) không có tệp như dbshelp.lib. Vì vậy, tại sao nó đang cố gắng để giải quyết biểu tượng đó bây giờ, thay vì sau đó khi DLL của tôi được nạp vào một ứng dụng? Và tại sao nó không thể thấy hàm đó bằng cách nào?

Để rõ ràng, tôi đã xác nhận rằng tôi đang xây dựng DLL x64 và rằng dbghelp.dll trong C: \ Windows \ System32 là x64.

+0

Nó vẫn cần phải liên kết với các thư viện dbghelp.lib nhập khẩu; điều này nên được bao gồm với Visual Studio, Platform SDK, vv – Luke

Trả lời

11

Liên kết đến các thư viện chia sẻ, DLL trong Windows-nói, yêu cầu sau đây:

  1. Một tập tin tiêu đề ở thời gian biên dịch: Dbghelp.h.
  2. Thư viện nhập vào thời gian liên kết: Dbghelp.lib.
  3. Một DLL trong thời gian chạy: Dbghelp.dll.

Bạn rõ ràng có 1 và 3 và bị thiếu 2. SDK Windows đi kèm với Visual Studio bao gồm thư viện nhập. Nhưng bạn cần phải thêm nó như là một phụ thuộc bổ sung trong các tùy chọn liên kết của dự án của bạn.

Như thế này:

enter image description here

+1

Đó là nó. Cửa sổ-tìm-fu của tôi yếu, hệ thống của tôi * có * có dbghelp.lib. Thêm nó vào các phụ thuộc làm việc như một sự quyến rũ. – user1243488

+0

Dbghelp là một trong những thư viện phức tạp hơn trong Windows. Đã có một số lượng lớn các phiên bản khác nhau được phát hành và nhiều bản phát hành ra khỏi ban nhạc với hệ điều hành. Nó rất dễ dàng để có được vào một tình huống mà bạn đang gọi các chức năng có mặt trên máy dev của bạn nhưng không có mặt trên các máy mục tiêu vani thuần túy. Hãy cẩn thận! –

+4

hoặc bạn có thể #pragma nhận xét (lib, "dbghelp.lib") –

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