2009-05-11 14 views
13

Mam tę aplikację MFC, nad którą pracuję, która musi mieć osadzoną bazę danych. Więc poszedłem na polowanie na zręczną, szybką "wbudowalną" bazę danych i natknąłem się na SQLite.Jak mogę rozwiązać problem "błąd LNK2019: nierozwiązany symbol zewnętrzny"?

Stworzyłem z nim DB, a ja stworzyłem projekt biblioteki statycznej z Visual Studio 2008. projekt biblioteki zostanie wykorzystany w innym głównym projekcie.

W projekcie bibliotecznym utworzyłem klasę DBClass za pomocą metody AddFeedToDB(CFeed f). Projekt biblioteki korzysta z pliku .lib z codeproject (cppsqlite3.lib).

Podczas kompilowania biblioteki statyczne, nie zostanie wykryty błąd, ale gdy próbuję użyć pliku projektu biblioteki w głównym projekcie, mam tego typu błędów:

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] 

Czego mi brakuje?

Odpowiedz

9

Zdarzyło mi się więcej niż jeden raz, że myślałem symbol XXX (tj [email protected]@@QAEXXZ) był w lib importu, podczas gdy rzeczywista symbol był __impXXX (tj [email protected]@@QAEXXZ).

Przyczyną błędu łącznikowej jest wówczas można znaleźć na etapie kompilacji: kompilator wygeneruje [email protected]@@QAEXXZ symbol być przywiezione, gdzie powinien generować [email protected]@@QAEXXZ. Często oznacza to, że sama deklaracja funkcji nie miała wartości __declspec(dllimport). Może to być spowodowane tym, że jakiś symbol preprocesora nie jest zdefiniowany. Lub __declspec w ogóle nie istnieje ...

+0

Czy to odpowiada na dane pytanie? – ST3

+0

@ ST3: najwyraźniej rozwiązał ten konkretny przypadek. Nie jest to ogólna recepta na rozwiązywanie błędów linkerów, jeśli o to ci chodzi. – xtofl

+0

Tak, dodanie tej linii rozwiązało również mój (podobny) problem. To, co się faktycznie dzieje, to to, że jakiś projekt potrzebuje symbolu zdefiniowanego w innej bibliotece dll, która nie jest eksportowana (zazwyczaj MSVS). –

1

Musisz albo połączyć bibliotekę SQLite codeproject z plikiem wykonywalnym, albo bezpośrednio pliki źródłowe w projekcie. (Który to zrobiłeś?)

+2

w projekcie bibliotecznym, poszedłem do projektu-> właściwości-> Właściwości konfiguracyjne-> Bibliotekarz-> Ogólne-> Dodatkowe zależności i dodałem do niego ".. \ SQLiteCommon \ sqlite3.lib". – Attilah

+0

Czy połączyłeś go statycznie (jak go skompilowałeś)? – MickaelFM

+0

Tak, powiązałem to statycznie, myślę. ale dziwne jest to, że tak jak w innych typach projektów, nie widzę zakładki Linker w Właściwości projektu-> Właściwości konfiguracji, ale zamiast tego widzę bibliotekarkę. – Attilah

1

chciałbym wykonaj następujące kroki:

  1. myśleć, co biblioteki lub .obj plik można oczekiwać symbol być eksportowane przez.

  2. sprawdź, czy to rzeczywiście czy wyeksportuj ten sam symbol (sprawdź pod względem charakteru). Czasami różni się konwencja telefonowania.

  3. Sprawdź, czy biblioteki można oczekiwać, aby zawierać symbol znany jest z łącznikiem - najpierw sprawdzić na „dodatkowych bibliotek”, a następnie sprawdzić, czy biblioteka jest rzeczywiście znaleźć (I głównie to zrobić za pomocą filemon.exe z sysinternals i szukać link.exe aby otworzyć plik lib.)

Po przemyśleniu chwilę może się okazać, że projekt biblioteki będzie nie wyeksportować poszukiwanych funkcji. Ta funkcja znajduje się w bazie danych lib. Powinieneś dodać tę bibliotekę do swojego głównego projektu. Nie ma sensu dodawać go do projektu statycznej lib.

+0

lib (sqlite.lib) eksportuje symbole. Dodałem bibliotekę do mojego głównego projektu, nadal nie działa. nadal mam te same błędy. – Attilah

1

Kompilator i linker nie będą łączyć jednej biblioteki w drugą (chyba że jest to DLL). Musisz określić obie biblioteki (cppsqlite3.lib i twoją własną bibliotekę statyczną) w swoim głównym projekcie.

4

Nie wiem, czy to twoja sprawa, ale prefiks imp może oznaczać, że kompilujesz bibliotekę x64 w projekcie Win32.

15

Wiem, że to już 2 lata od tego pytania ... ale biegam w tej samej sytuacji tutaj. Dodano wszystkie pliki nagłówkowe ... dodano katalogi lib ... i nadal mam ten błąd. Więc ręcznie dodałem lib do Właściwości konfiguracji -> Łącznik -> Wejście -> Uzależnienia dodatkowe i wszystko działa dla mnie.

+0

Świetnie, dzięki za dobrą odpowiedź, błąd linkera wynika z zależności –

Powiązane problemy