Связывание библиотеки SIFT Роба Гесса (в C, используя OpenCV) с C ++ - PullRequest
2 голосов
/ 27 декабря 2011

Я пытаюсь использовать SIFT-библиотеку Роба Гесса в моем проекте C ++.Я просмотрел (код) других реализаций SIFT, но эта, по-видимому, наиболее разделена по фазе, как и оригинальная статья Лоу, и также использует OpenCV, с которым я знаком, поэтому я выбрал эту.

К сожалениюУ меня были только проблемы, так как я пытался использовать его в C ++.Библиотека изначально написана на C с OpenCV.

Я пытался скомпилировать свой код как с окружением include-s библиотеки C, так и без него с помощью extern, но ни одна из них не работает.Я думаю, что диагностировал проблемы в обоих случаях, но я не знаю, как их решить, и я был бы очень признателен за любую помощь.

Проблемы (или, по крайней мере, как мне кажется, проблемы):

  • без h extern: не работает из-за искажения имен в C ++ (я проверил, и, конечно, все имена функций оформлены)

  • с extern: не работает, потому что OpenCV может определять погоду, скомпилированную для C или C ++.Нет проблем со связью ни с одной из функций библиотеки SIFT, но теперь OpenCV включает заголовки C ++, и, поскольку в основной программе он в конечном итоге включен в блок extern, я получаю (буквально сотни) ошибок, подобных этим:

    /usr/local/include/opencv2/core/mat.hpp:2361: error: template with C linkage

Я пытался сделать эту работу последние пару дней, поэтому, если кто-то пытался работать с той же библиотекой SIFT в C ++ или испытываланалогичные проблемы с другой библиотекой, помощь будет наиболее ценной.

1 Ответ

3 голосов
/ 27 декабря 2011

Похоже, мне удалось найти довольно хорошие решения.Два способа, легкий и элегантный:

Легкий:

Просто включите все заголовки OpenCV, используемые в библиотеке (и любые другие необходимые заголовки OpenCV) перед раздел extern "C", включающий все заголовки библиотеки SIFT.

Elegant

Во всех заголовках библиотеки добавьте разделы extern "C" вокруг всего кода за исключением , который включает OpenCV, например:

// OpenCV includes:
#include "cxcore.h"
#include ....

#if __cplusplus
extern "C" {
#endif

...
function definitions in the header file
...

#if __cplusplus
}
#endif

Теперь все включенные библиотеки могут быть #include d непосредственно в коде C ++ без extern "C".Библиотеки OpenCV правильно компилируются для C / C ++ (в зависимости от компилятора), и относительный порядок дополнительных включений OpenCV и включения библиотеки SIFT не имеет значения.

...