2008-12-02 52 views
5

Tôi đang sử dụng hệ thống makefile với trình biên dịch pvcs (sử dụng trình biên dịch Microsoft Visual C++, 2008) và tôi nhận được một số lỗi liên kết của biểu mẫu:Lỗi Clrdump (C++) LNK2019: biểu tượng bên ngoài chưa được giải quyết __imp__RegisterFilter @ 8 được tham chiếu trong hàm _main

error LNK2019: unresolved external symbol [email protected] referenced in function _main

này đang xảy ra mặc dù sử dụng các extern "C" khai, tức là .:

extern "C" int CLRDUMP_API RegisterFilter(LPCWSTR pDumpFileName, unsigned long DumpType); 

Ngoài ra, trong makeexe.mak, thư viện đã được liên kết trong như:

$ (COMPILEBASE) \ lib \ clrdump.lib \

Thành thật mà nói, tôi không phải là chuyên gia tại makefiles, và tôi đang thay đổi trên một hệ thống từ Microsoft Visual C++ 6.0 đến 2008. Sự thay đổi này có thể có một cái gì đó để làm với các lỗi liên kết, như hệ thống được sử dụng để làm việc trước đây.

Bất kỳ trợ giúp nào thực sự sẽ được đánh giá cao.

Cảm ơn trước,

Trân trọng, Joseph

- Chỉnh sửa 1-

Có ai biết làm thế nào để biến tiết trên trong hệ thống makefile của PVC?

Lưu ý rằng các chức năng trên đã là một phiên bản trình biên dịch trang trí, có

[email protected] 

trong khi hàm C++ chỉ là

RegisterFilter 

Thanks for the help, nhưng nếu ai cũng có thể viết nhiều hơn giải pháp hoàn chỉnh, điều đó cũng sẽ rất được đánh giá cao.

Trân trọng, Joseph

- Sửa 2-

Một số người tốt bụng gửi này, nhưng khi tôi đăng nhập nó biến mất:

Các imp tiền tố chỉ ra rằng chức năng này được nhập khẩu từ một DLL. Kiểm tra định nghĩa của CLRDUMP_API - là nó __declspec(dllimport)? Tìm hiểu thêm thông tin qua bài báo này.

Đã có liên kết hoạt động nhưng tôi đã mất liên kết đó, tuy nhiên tôi cho rằng người ta luôn có thể tìm kiếm chủ đề.

Cảm ơn, cho dù bạn là ai!

- Sửa 3-

Cảm ơn ChrisN (tôi chưa được phép bỏ phiếu). Mặc dù sử dụng nút làm mới, câu trả lời của bạn biến mất, nhưng sau đó lại xuất hiện sau khi tôi đăng một bản cắt-n-dán.

Đây là định nghĩa của tôi về điều đó:

define CLRDUMP_API __declspec(dllimport) __stdcall 

Tôi giả định rằng __stdcall là OK?

- Sửa 4-

Trong khi tôi đánh giá cao những nỗ lực của những người trả lời, đặc biệt là ChrisN, ít nhất là trên hệ thống đặc biệt của tôi, các lỗi liên kết vẫn còn. Vì vậy, nếu bất cứ ai có bất kỳ cái nhìn sâu sắc hơn nữa, tôi sẽ đánh giá cao nó. Cảm ơn một lần nữa.

Trả lời

3

tôi đã tạo ra một ứng dụng C++ Win32 đơn giản trong VS2005 và tôi đã nhận được lỗi này:

LNK2019: unresolved external symbol __imp__somefunction 

Ứng dụng này được sử dụng tờ sở hữu, do đó nó đòi hỏi tiêu đề này (prsht.h).

Giải pháp cho vấn đề của tôi là như sau: trong chương trình Properties → Configuration Properties → Linker → chung, tôi đặt Thư mục Thư viện bổ sung-"C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib".

Cũng trong chương trình Properties → Configuration Properties → Linker → dòng lệnh cho Thêm lựa chọn, tôi đã thêm ComCtl32.Lib ComDlg32.Lib.

Chương trình của tôi hiện đang biên dịch mà không gặp bất kỳ sự cố nào. Hai xu của tôi: bạn cần phải xác định tất cả các thư viện mà chương trình của bạn yêu cầu. Gợi ý: kiểm tra tất cả các tiêu đề bạn đã bao gồm, bạn cần phải chắc chắn rằng mối liên kết của bạn có thể nhìn thấy chúng.

+1

Tôi đã phát triển một ứng dụng ATL/COM rất đơn giản và đã cố gắng gọi phương thức CreateMappedBitmap (...).Tôi đã nhận được lỗi LNK2019 cho phương thức này gọi bằng cách sử dụng VS 2012. Đề xuất ở trên về việc thêm công việc comctl32.lib cho tôi. không thực hiện bất kỳ thay đổi nào khác. –

3

Thử bật đầu ra chi tiết cho trình liên kết của bạn (thường là công tắc dòng lệnh). Điều đó sẽ cho bạn thấy chính xác cách thức các mối liên kết đang cố gắng để giải quyết các biểu tượng, vì vậy bạn có thể thấy nếu:

  • chữ ký của biểu tượng là những gì bạn mong đợi
  • mối liên kết đang tìm kiếm ở vị trí phù hợp với thư viện của bạn

Tôi hy vọng điều này sẽ hữu ích!

14

Tiền tố __imp_ cho biết rằng trình liên kết mong muốn chức năng này được nhập từ một DLL.

Thư viện clrdump từ this page? Nếu vậy, lưu ý rằng extern "C" không được sử dụng trong tệp tiêu đề được cung cấp cùng với thư viện. Tôi xác nhận điều này bằng cách sử dụng lệnh sau:

dumpbin /exports clrdump.lib 

trong đó sản xuất đầu ra sau đây cho RegisterFilter - đây là một C++ tên hàm đọc sai:

[email protected]@[email protected] (int __stdcall RegisterFilter(unsigned short const *,unsigned long))

tôi cố gắng tạo ra một chương trình mẫu sử dụng clrdump.lib sử dụng Visual Studio 2008. Dưới đây là mã của tôi:

#include <windows.h> 
#include "ClrDump.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    RegisterFilter(L"", 0); 
    return 0; 
} 

Xây dựng này được sản xuất lỗi mối liên kết sau đây:

LNK2019: unresolved external symbol "__declspec(dllimport) int __stdcall RegisterFilter(wchar_t const *,unsigned long)" ([email protected]@[email protected])

Mã xây dựng OK với Visual C++ 6.0.

Lưu ý rằng đầu ra dumpbin hiển thị tham số đầu tiên là RegisterFilterunsigned short const * nhưng lỗi trình liên kết hiển thị wchar_t const *. Trong Visual C++ 6.0, wchar_t thường là một typedef cho unsigned short, trong khi ở các phiên bản sau nó là một kiểu tích hợp riêng biệt.

Để khắc phục sự cố trong Visual Studio 2008, tôi đặt tùy chọn "Điều chỉnh wchar_t là Kiểu dựng sẵn" thành "Không" (chỉ định /Zc:wchar_t- trên dòng lệnh trình biên dịch), và mã bây giờ xây dựng OK.

Xin lỗi vì sự nhầm lẫn với câu trả lời trước của tôi. Tôi hy vọng điều này hữu ích hơn!

+0

ChrisN: Việc này vượt quá và trên những gì được mong đợi trong các nhóm đăng bài này. Tôi đã thử cả hai bằng cách sử dụng một diễn viên trong chức năng gọi điện thoại (trình biên dịch nghẹn ngào trên đó và nó đã được gỡ bỏ) và tôi cũng đã thử tùy chọn trình biên dịch: /Zc: wchar_t- Trong trường hợp của riêng tôi, mặc dù làm một xây dựng sạch đầu tiên, nó vẫn còn thất bại! – JosephDoggie

+1

Nếu không nhìn thấy nhiều mã của bạn, tôi không nghĩ rằng tôi có thể trợ giúp thêm. Bạn có mã nguồn cho thư viện không? – ChrisN

3

Không biết nếu đó là trường hợp của bạn, nhưng tiền tố imp có thể có nghĩa là bạn đang biên soạn thư viện x64 trong dự án Win32.

1

Sử dụng một .DEF file

Nếu bạn chọn sử dụng __declspec (dllimport) cùng với một tập tin .DEF, bạn nên thay đổi các tập tin .DEF sử dụng DATA hoặc CONSTANT để giảm khả năng mã hóa không chính xác sẽ gây ra một vấn đề:

// project.def 
LIBRARY project 
EXPORTS 
    ulDataInDll CONSTANT 

bảng dưới đây cho thấy lý do tại sao:

Keyword  Emits in the import library Exports 
CONSTANT  _imp_ulDataInDll    _ulDataInDll 
      _ulDataInDll     

DATA   _imp_ulDataInDll    _ulDataInDll 

http://msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx

5

Gần đây tôi đã có cùng một vấn đề. Tôi đã loại trừ một thư viện để tránh va chạm, và tất cả các lỗi đã biến mất, ngoại trừ các lỗi LINK (giống như bạn mô tả). Khi tôi trao đổi thư viện cho một thư viện khác (tôi đã loại trừ (bỏ qua) MSVCRT.lib, bây giờ tôi không bao gồm (bỏ qua) LIBCMT.lib) vấn đề biến mất. Đảm bảo bạn không có thư viện hỗn hợp ở đâu đó. Trong trường hợp của tôi, trình liên kết không thành công với "không thể tìm thấy imp _aligned_malloc". Tất nhiên không có phương pháp nào trong bất kỳ mã nào của tôi theo tên đó. Trình biên dịch đang chờ thêm imp. Chính xác lý do tại sao tôi không biết, ngoại trừ vấn đề đã biến mất khi tôi đổi chỗ loại bỏ (bỏ qua) như mô tả ở trên.

Thử bắt đầu với một dự án mới và thêm lại nguồn của bạn & tệp tiêu đề và theo dõi các thư viện bạn loại trừ (bỏ qua). Hãy thử các kết hợp khác nhau. Hy vọng rằng sẽ giúp.

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