Я боролся некоторое время с ошибкой в 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
'# include' включает заголовки, он не ссылается на библиотеки. Вы настроили свой проект, чтобы фактически связать его с библиотекой? Кроме того, маловероятно, что вам нужен блок «extern» C ». Заголовки в эти дни знают о C++, и вы не должны пытаться делать это вручную. В заголовках libgit2, если вы их осмотрите, вы увидите защитные '#ifdef __cplusplus'. Поэтому вы должны удалить блок «extern» C «" из своего кода. –
Nikos, спасибо за ответ. Я добавил библиотеку и заголовки в файл проекта, и если я переименую какое-либо из определений LIBS, он говорит, что он не может найти ни lib, ни файл .h, поэтому кажется, что он находит оба этих файлов. К сожалению, удаление extern не помогло. – Shookit
Вы удалили блок «extern» C «? Вы не должны использовать его для libgit2. –