2012-07-02 3 views
2

Я пытаюсь создать некоторый код для чтения видео в libavformat. После получения скомпилированных DLL и .lib файлов here, я иду, чтобы построить мой код, и компоновщик не может найти какой-либо из символов libavformat, хотя я связан в предоставленных файлах .lib.Ссылка на libavformat в Visual Studio 2010

Осмотр libavformat.lib с dumpbin -headers показывает, что он экспортирует нужные функции с помощью префикса подчеркивания. Например, хотя я хочу позвонить avformat_open_input, файл .lib дает _avformat_open_input.

Почему это, и почему я не могу связать предварительно скомпилированные DLL?

+0

Является ли ваше приложение платформой x64? Также скопируйте точное сообщение об ошибке здесь. – hege

+0

Я просто строю 32-битное приложение. Ошибки компоновщика являются только вашими традиционными LibavVideoReader.obj: ошибка LNK2019: неразрешенный внешний символ «int __cdecl avformat_open_input (struct AVFormatContext * *, char const *, struct AVInputFormat *, struct AVDictionary * *)" (? Avformat_open_input @@ YAHPAPAUAVFormatContext @ @ PBDPAUAVInputFormat @@ PAPAUAVDictionary @@@ Z) ссылка на функцию ... сообщений –

+2

Вы компилируете свой код как C или как C++? Если последний, вы убедились, что объявления C из этих библиотек завернуты в 'extern 'C"?? – ildjarn

ответ

7

Вам необходимо выполнить следующие задачи: libav с . Первого Гото Zeranoe

  1. Скачать Shared Версию, Скопировать все файлы из .dllbin папки и вставить их в выходном каталоге, где exe будет сгенерирован.
  2. Скачать Developer Версия, Скопировать все .lib файлы из lib папку и вставить их в основной файл C++ находится (например, Folder-1\Folder-2 Где Folder-1 есть файл .sln, так что вы должны поместить .lib файлы в Folder-2)
  3. Из Developer версии вы загруженный на шаге 2 копии всех каталогов из include папки и вставить их в папку-2 (Подробнее о папка-2 в шаге 2)
  4. Скачать inttypes.h и stdint.h, сохранить его на этом месте C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ папки.
  5. Чтобы включить файлы заголовков используйте следующий синтаксис

Вы должны использовать этот extern, потому что libav является C библиотека.

extern "C" { 
    #include "libavcodec/avcodec.h" 
    #include "libavdevice/avdevice.h" 
    #include "libavfilter/avfilter.h" 
    #include "libavformat/avformat.h" 
    #include "libavutil/avutil.h" 
} 
0

Извлеките 32-битные библиотеки, и вы должны быть в порядке :) Ваша платформа приложений должна соответствовать используемым библиотекам (и наоборот).

+0

Я использую 32-битные. Что заставило бы вас поверить иначе? –

+0

Название функции украшение. Вы уверены, что выбрали хорошие библиотеки? _ExportedNameStartingWithUnderscore - это украшение x64. – hege

+0

Это была проблема C/C++. Обертка заголовков в 'extern 'C" {} 'исправлена ​​все. –

0

Как скомпилировать его как статическую библиотеку .lib?