2009-01-28 28 views
67

Tôi đang đánh giá một số phần mềm không có giấy tờ. Khi tôi tạo một dự án mẫu, tôi nhận được lỗi liên kết trông giống như:Công cụ để kiểm tra các tệp .lib?

error LNK2019: unresolved external symbol

Không có nhiều tệp lib với ứng dụng này, vì vậy tôi có thể giải quyết vấn đề này bằng thử và sai, nhưng tôi biết có thêm cách thanh lịch là giải quyết vấn đề này.

Trong thế giới java, tôi sẽ grep FOO * .jar để tìm bình và tôi đang tìm kiếm tương tự C++. Tôi đang làm việc với mã C++ trong Visual Studio 2005.

Tôi nghi ngờ tiện ích lib.exe với tùy chọn/LIST có thể nhận được thông tin, nhưng tôi đã không thành công cho đến nay. Nó chỉ in ra:

 
Microsoft (R) Library Manager Version 8.00.50727.762 
Copyright (C) Microsoft Corporation. All rights reserved. 

granite50.dll 
granite50.dll 
granite50.dll 
granite50.dll 
... 

Mọi đề xuất?

Trả lời

81

Trước hết, bạn cần biết loại thư viện nào bạn đang xem. Một số thư viện chỉ chứa liên kết cho một DLL (tức là, thư viện nhập khẩu) và các thư viện khác là các đối tượng mã trở thành một phần của hình ảnh thực thi (tức là các thư viện tĩnh). Từ giao diện của đầu ra đó, bạn đã nhìn vào một thư viện nhập khẩu DLL.

Tiếp theo bạn muốn sử dụng đúng công cụ. Lib.exe được sử dụng để trích xuất các tập tin đối tượng từ các thư viện và những gì không. Điều này khá giống với tiện ích jar cho Java. Microsoft cung cấp dumpbin.exe sẽ đổ thông tin từ thư viện. Tôi thấy rằng LarryF đã đề cập đến điều này.

Để nhập thư viện, hãy chạy dumpbin.exe -headers foo.lib và chuyển hướng tệp đó đến tệp đầu ra. Đầu ra sẽ chứa các đoạn mã cho mỗi biểu tượng mà DLL xuất khẩu liên quan. Tìm kiếm các dòng bắt đầu bằng " Symbol name :". Lưu ý rằng có hai dấu cách trước và sau "Tên biểu tượng" nếu bạn muốn khớp chính xác. Bạn cũng có thể chạy các đầu ra thông qua findstr để tạo ra một danh sách các biểu tượng và chuyển hướng đến một tập tin văn bản nếu bạn muốn một chút gì đó đẹp hơn để xem xét:

dumpbin.exe -headers foo.lib | findstr /c:" Symbol name :" > foo-exports.txt 

Các tùy chọn khác là để mở DLL liên quan với depends.exe .

+0

Đối với bất kỳ ai gặp sự cố khi chạy 'dumpbin.exe' từ' Powershell' - https://stackoverflow.com/questions/477387/cannot-find-dumpbin-exe/38616596#38616596 – Ralt

15

Có thể có nhiều vấn đề ở đây. Tôi không chắc chắn tìm kiếm trong các tập tin lib sẽ là cách tốt nhất để giải quyết nó, IMHO ... Tuy nhiên, DUMPBIN.exe có lẽ là công cụ bạn đang tìm kiếm. Sử dụng nó từ dòng lệnh, nhưng chắc chắn rằng đường dẫn của bạn được thiết lập, hoặc sử dụng "Visual Studio Command Prompt" mà VS cài đặt cho bạn trong trình đơn bắt đầu VS của bạn.

+0

Cảm ơn bạn đã trỏ đến dumpbin. Tôi đã làm dumpbin/all.lib> some.dump sau đó grep'd thông qua các tệp kết xuất của tôi và tìm thấy thư viện mà tôi cần để liên kết. – criddell

+2

+1 cho tham chiếu "Visual Studio Command Prompt" – Steed

8

làm việc này với hình ảnh C++ express 9 .lib:

dumpbin.exe -headers clangParse.lib | findstr/c: "COMDAT"> clangParse-exports.txt

hoặc dumpbin.exe -headers clangParse.lib | findstr/c: "sym ="> clangParse-exports.txt

cảm ơn bạn d.shawley

10

Nếu bạn có một DLL và muốn sử dụng nó trong mã của bạn với __declspec(dllimport) bạn có thể tạo file LIB cần một cách dễ dàng nếu bạn có một tập tin DEF cho DLL:

lib /def:mydll.def /nologo /machine:x86 

mà tạo ra mydll. lib

Lệnh này sẽ được chạy trong dấu nhắc lệnh của Visual Studio SDK.

Một tập tin DEF có thể được viết bằng tay rất dễ dàng nếu bạn không có một: Bạn mở DLL trong DependencyWalker (http://www.dependencywalker.com), chọn "Save As" -> "Văn bản với danh sách Import/Export" và có tênordinals của tất cả các chức năng xuất khẩu trong một file txt như thế này:

Export Ordinal  Hint   Function       Entry Point 
------ ----------- ----------- -------------------------------- ----------- 
[C ] 2 (0x0002) 1 (0x0001) gsasl_base64_from     0x000024F0 
[C ] 3 (0x0003) 2 (0x0002) gsasl_base64_to     0x000024A0 
[C ] 4 (0x0004) 3 (0x0003) gsasl_callback     0x000018B0 
[C ] 5 (0x0005) 4 (0x0004) gsasl_callback_hook_get   0x00001900 
[C ] 6 (0x0006) 5 (0x0005) gsasl_callback_hook_set   0x000018F0 
[C ] 7 (0x0007) 6 (0x0006) gsasl_callback_set    0x000018A0 
[C ] 8 (0x0008) 7 (0x0007) gsasl_check_version    0x00001870 
[C ] 9 (0x0009) 8 (0x0008) gsasl_client_mechlist    0x00001E20 
[C ] 10 (0x000A) 9 (0x0009) gsasl_client_start    0x00001F40 

phần còn lại được nhanh chóng thực hiện. Tạo một DEF nộp trong đó có định dạng này:

EXPORTS 
gsasl_base64_from @2 
gsasl_base64_to @3 
gsasl_callback @4 
gsasl_callback_hook_get @5 
gsasl_callback_hook_set @6 
gsasl_callback_set @7 
gsasl_check_version @8 
gsasl_client_mechlist @9 
gsasl_client_start @10 
gsasl_client_suggest_mechanism @11 

Số đằng sau @ là thứ tự.


PD: DependencyWalker thậm chí có thể undecorate tên khó hiểu của C++ xuất khẩu như

[email protected]@[email protected] --> int Foo(int, int). 
2

mở Visual Studio Command Prompt

dumpbin/all Effects11.lib> D: \ 1. txt

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