2013-02-13 3 views
2

Я боролся некоторое время с ошибкой в ​​Qt:Qt Creator: неразрешенный внешний символ

mainwindow.obj:-1: error: LNK2019: unresolved external symbol _git_repository_open referenced in function "public: __thiscall MainWindow::MainWindow(class QWidget *)" ([email protected]@[email protected]@@@Z) 

Это, очевидно, ошибка ссылки, но я не был в состоянии выяснить, что является причиной это. Все это скомпилировано в Windows, а для библиотеки, на которую я настроен таргетинг, является libgit2.

Я скомпилировал libgit2 с помощью MVSC2010 (который я также использую для своих Qt-сборок), а затем добавил внешнюю библиотеку в мой проект Qt. Эти вложения подтверждаются без проблем, но библиотека не связана должным образом. Поскольку libgit2 является библиотека C, я попытался включила библиотеку в экстерне блока (а также без exern блока) не дали никаких результатов:

extern "C" { 
    #include <git2.h> 
} 

Кроме того, функция находится в файле Lib:

dumpbin /EXPORTS git2.lib 
... 
[email protected] 
... 

соответствующие строки, проливающие ошибку (первый работает, если сама по себе, так как оно определено в заголовке мерзавца, но вторая линия терпит неудачу при установлении связи):

git_repository *repo; 
git_repository_open(&repo, "/opt/libgit2-test/.git"); 

Соответствующие qt.pro строки файла:

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/libgit2/lib/ -lgit2 
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/libgit2/lib/ -lgit2d 
else:unix: LIBS += -L$$PWD/libgit2/lib/ -lgit2 

INCLUDEPATH += $$PWD/libgit2/include 
DEPENDPATH += $$PWD/libgit2/include 
+1

'# include' включает заголовки, он не ссылается на библиотеки. Вы настроили свой проект, чтобы фактически связать его с библиотекой? Кроме того, маловероятно, что вам нужен блок «extern» C ». Заголовки в эти дни знают о C++, и вы не должны пытаться делать это вручную. В заголовках libgit2, если вы их осмотрите, вы увидите защитные '#ifdef __cplusplus'. Поэтому вы должны удалить блок «extern» C «" из своего кода. –

+0

Nikos, спасибо за ответ. Я добавил библиотеку и заголовки в файл проекта, и если я переименую какое-либо из определений LIBS, он говорит, что он не может найти ни lib, ни файл .h, поэтому кажется, что он находит оба этих файлов. К сожалению, удаление extern не помогло. – Shookit

+0

Вы удалили блок «extern» C «? Вы не должны использовать его для libgit2. –

ответ

5

Похоже, вы запускали через эту проблему:

Вы можете попробовать предложение здесь:

https://github.com/libgit2/libgit2/pull/749#issuecomment-6434565

При построении на Windows с th e Цепочка инструментов MSVC, сборка по умолчанию использует соглашение __stdcall. Однако это не отражено в заголовочных файлах , поэтому вам нужно использовать параметр компилятора/Gz в своей собственной сборке , а также за возможность успешно связываться с libgit2, построенным таким образом. Если это невозможно или нежелательно, установите параметр -DSTDCALL = OFF при выполнении начального cmake.

+0

Я просто хочу сообщить вам, что вы удивительный человек. Это была проблема. Я только начинаю изучать Qt, поэтому я решил, что с этой целью, но это исправлено. В очередной раз благодарим за помощь. – Shookit

Смежные вопросы