2009-05-11 61 views
13

Tôi đã có ứng dụng MFC này Tôi đang làm việc trên đó cần phải có một cơ sở dữ liệu nhúng. Vì vậy, tôi đã đi săn cho một cơ sở dữ liệu "có thể nhúng" trơn tru, nhanh chóng cho nó và tình cờ gặp phải SQLite.Làm cách nào tôi có thể giải quyết "lỗi LNK2019: biểu tượng bên ngoài chưa được giải quyết"?

Tôi đã tạo một DB với nó và tôi đã tạo một dự án thư viện tĩnh với Visual Studio 2008. dự án thư viện sẽ được sử dụng trong một dự án chính khác.

Trong dự án thư viện, tôi đã tạo một lớp học DBClass với phương thức AddFeedToDB(CFeed f). Dự án thư viện sử dụng các tập tin .lib từ codeproject (cppsqlite3.lib).

Khi biên dịch thư viện tĩnh, không có lỗi được phát hiện, nhưng khi tôi cố gắng sử dụng các tập tin dự án thư viện trong dự án chính, tôi có được những loại lỗi:

error LNK2019: unresolved external symbol "public:void __thiscall 
    CppSQLite3DB::close(void)" ([email protected]@@QAEXXZ 
    referenced in function "public: int __thiscall 
    CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (? 
    [email protected]@@[email protected]@[email protected] 

tôi đang thiếu gì?

Trả lời

9

Nó xảy ra với tôi nhiều hơn một lần mà tôi nghĩ biểu tượng XXX (ví dụ: [email protected]@@QAEXXZ) trong lib nhập khẩu, trong khi biểu tượng thực tế là __impXXX (ví dụ: [email protected]@@QAEXXZ).

Lý do cho sự lỗi mối liên kết là sau đó được tìm thấy trong các bước biên dịch: trình biên dịch sẽ tạo ra các biểu tượng [email protected]@@QAEXXZ được nhập khẩu, nơi nó nên tạo [email protected]@@QAEXXZ. Điều này thường có nghĩa là bản thân khai báo hàm không có __declspec(dllimport). Điều này có thể do một số ký hiệu tiền xử lý không được xác định. Hoặc __declspec không có ở tất cả ...

+0

Điều này có trả lời cho câu hỏi đã cho không? – ST3

+0

@ ST3: rõ ràng, nó đã giải quyết trường hợp cụ thể này. Nó không phải là một công thức chung để giải quyết các lỗi liên kết, nếu đó là những gì bạn có ý nghĩa. – xtofl

+0

Có, việc thêm dòng này đã giải quyết vấn đề (tương tự) của tôi. Điều gì thực sự xảy ra là một số dự án cần một biểu tượng được định nghĩa trong dll khác mà không được xuất (thường là MSVS) –

1

Bạn cần phải liên kết mã từ SQLite lib với tệp thi hành của bạn hoặc để đưa trực tiếp tệp nguồn vào dự án của bạn. (Mà một trong những bạn đã làm?)

+2

trong dự án thư viện, tôi đã đi đến project-> properties-> Configuration Properties-> Librarian-> General-> Dependencies bổ sung và tôi đã thêm ".. \ SQLiteCommon \ sqlite3.lib" vào nó. – Attilah

+0

Bạn đã liên kết nó tĩnh (khi bạn biên soạn nó) chưa? – MickaelFM

+0

vâng, tôi đã liên kết nó một cách tĩnh lặng, tôi nghĩ vậy. nhưng kỳ lạ của wht là như trong các loại dự án khác, tôi không thấy một thẻ Linker trong thuộc tính Project-> Configuration properties, nhưng tôi thấy Librarian thay thế. – Attilah

1

tôi sẽ làm theo các bước sau:

  1. suy nghĩ về thư viện gì hoặc .obj nộp bạn mong đợi biểu tượng để được xuất khẩu bởi.

  2. kiểm tra xem nó có thực sự không xuất biểu tượng đó (kiểm tra ký tự khôn ngoan). Đôi khi, đó là quy ước gọi khác nhau.

  3. kiểm tra xem thư viện bạn muốn chứa biểu tượng được biết đến với trình liên kết hay không - trước tiên hãy kiểm tra 'thư viện bổ sung', sau đó kiểm tra xem thư viện có thực sự được tìm thấy hay không (tôi chủ yếu làm điều này bằng cách sử dụng filemon.exe từ sysinternals , và tìm kiếm link.exe để mở file lib.)

Sau khi suy nghĩ một lúc, bạn có thể thấy rằng dự án thư viện của bạn sẽ không xuất tìm cho chức năng. Hàm đó nằm trong lib cơ sở dữ liệu. Bạn nên thêm lib đó vào dự án chính của bạn. Nó không sử dụng thêm nó vào dự án lib tĩnh của bạn.

+0

lib (sqlite.lib) xuất các biểu tượng. tôi đã thêm lib vào dự án chính của tôi, vẫn không hoạt động. tôi vẫn nhận được các lỗi tương tự. – Attilah

1

Trình biên dịch và trình liên kết sẽ không liên kết một thư viện với nhau (trừ khi một là một DLL). Bạn cần phải xác định cả hai thư viện (cppsqlite3.lib và thư viện tĩnh của riêng bạn) trong dự án chính của bạn.

4

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 một thư viện x64 trong một dự án Win32.

15

Tôi biết đã 2 năm kể từ khi câu hỏi này ... nhưng tôi chạy trong cùng một tình huống ở đây. Đã thêm tất cả các tệp tiêu đề ... đã thêm thư mục lib .. và tiếp tục gặp lỗi này. Vì vậy, tôi đã thêm thủ công các thuộc tính Cấu hình -> Trình liên kết -> Đầu vào -> Phụ thuộc Aditional và tất cả đều hoạt động cho tôi.

+0

Tuyệt vời, Cảm ơn bạn đã trả lời tốt, lỗi liên kết là do phụ thuộc –

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