VLC Api с C++ - ошибка компоновщика для .lib (даже когда я добавил его в свой проект VC++)

Я хотел скомпилировать пример программы на C++, использующей VLC Api, в соответствии с https://wiki.videolan.org/LibVLC_Tutorial/, с моей Visual Studio 2012 на Windows 7 x64 (я все равно работаю с x86).

Чтобы получить файл .lib, я выполнил следующие действия: https://wiki.videolan.org/GenerateLibFromDll/ . Сначала у меня были некоторые проблемы, но в итоге я получил (я заметил предупреждения): введите описание изображения здесь

И у меня есть созданный libvlc.lib. Я переместил его в папку со своим main.cpp, добавил путь к Project -> VC++ Directories -> Library directories, а также добавил файл .lib с Add -> existing item. Я также добавил Project -> VC++ Directories -> Include Directories, чтобы он указывал на ...vlc-2.1.5\include.

Я запускаю clean, rebuild all в своем пустом решении.

К сожалению, я получил ошибки:

1>------ Rebuild All started: Project: Project1, Configuration: Debug Win32 ------
1>  Source.cpp
1>Source.obj : error LNK2019: unresolved external symbol _libvlc_new referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol _libvlc_release referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol _libvlc_media_new_location referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol _libvlc_media_release referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol _libvlc_media_player_new_from_media referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol _libvlc_media_player_release referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol _libvlc_media_player_play referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol _libvlc_media_player_stop referenced in function _main
1>...\Project1\Debug\Project1.exe : fatal error LNK1120: 8 unresolved externals

Похоже, что либо что-то не так с моим .lib, либо он каким-то образом неправильно подключен. Компиляция работает нормально, линковка не работает.

Полный исходный код единственного .cpp файла в проекте является точной копией руководства, размещенного на videolan.org: http://pastebin.com/5gfFVFZd

редактировать:

Согласно комментарию @user1, я исправил команду dumpbin (на скриншоте "libvlc.dill" должно быть "libvlc.dll"). Это действительно была одна проблема. После изменения я получил гораздо больше предупреждений (все того же типа, что и раньше, 277 вместе) и гораздо больший .def-файл (15 МБ, прогресс). Но выходной файл .lib имеет точно такой же размер (1,48 МБ - это очень маленький .lib), и ошибка компоновщика с ним преобладает. Так что я предполагаю, что с созданием .lib все еще что-то не так.

Файл .def: http://pastebin.com/E81s6dnh Последние строки вызывают у меня дискомфорт:

    256   FF 00001CF0 libvlc_vprinterr
    257  100 00001790 libvlc_wait
LINK : fatal error LNK1328: missing string table

person PolGraphic    schedule 29.12.2014    source источник
comment
Проверьте команду dumpbin на снимке экрана, libvlc.dill должен быть libvlc.dll   -  person user1    schedule 29.12.2014
comment
@ user1 а, спасибо! :) Это была действительно одна проблема. После изменения я получил гораздо больше предупреждений (все того же типа, что и раньше, 277 вместе) и гораздо больший .def файл (15 МБ, прогресс). Но выходной файл .lib имеет точно такой же размер (1,48 МБ - он очень маленький .lib), и с ним преобладает ошибка компоновщика. Так что я предполагаю, что с созданием .lib все еще что-то не так.   -  person PolGraphic    schedule 29.12.2014
comment
Вообще говоря, когда все входные данные для компоновщика верны, и все же, если компоновщик жалуется, я бы посмотрел на некоторые lib import #defines специально. Иногда .lib нельзя просто импортировать без определения некоторого #DEFINE в настройках ввода компоновщика, который позволяет импортировать библиотеку. например ИМПОРТ_X_LIB. У вас есть такая библиотека импорта #define, определенная для vlc lib. если да, вы должны добавить их во входные данные компоновщика.   -  person user1    schedule 29.12.2014
comment
@ user1 Хорошо, я обнаружил вторую проблему - файл .def не был правильно изменен (EXPORTS libvlc_add_intf libvlc_audio_get_channel..., как говорится в учебнике). После этого программа скомпилировалась. Можете ли вы сделать ответ из вашего комментария + тот? Я могу принять это :)   -  person PolGraphic    schedule 29.12.2014
comment
Вам не нужно собирать libvlc.lib самостоятельно. Вы можете получить проект VS для создания библиотеки на google.code или получить libvlc.lib с libvlc sdk на GitHub   -  person RSATom    schedule 30.12.2014
comment
@RSATom - оба они предоставляют только 32-битную библиотеку. У меня та же проблема с той же настройкой против VLC 2.2.1.   -  person T.E.D.    schedule 13.08.2015
comment
...из того, что я вижу, похоже, что моя проблема была решена простым игнорированием ошибки. Мне действительно не нужна таблица строк для создания файла .lib.   -  person T.E.D.    schedule 13.08.2015


Ответы (2)


Проверьте команду dumpbin на снимке экрана,

"libvlc.dill" должен быть "libvlc.dll"

Вообще говоря, когда все входные данные для компоновщика верны, и все же, если компоновщик жалуется, я бы посмотрел на некоторые lib import #defines специально. Иногда .lib нельзя просто импортировать без определения некоторого #DEFINE в настройках ввода компоновщика, который позволяет импортировать библиотеку. например ИМПОРТ_X_LIB. У вас есть такая библиотека импорта #define, определенная для vlc lib. если да, вы должны добавить их во входные данные компоновщика.

person user1    schedule 29.12.2014

В инструкциях на вики есть ошибка.

(1) Вам необходимо установить 32-разрядную версию VLC, а НЕ 64-разрядную версию, загрузив установщик «Windows» с здесь.

(2) Он устанавливается в папку «C:\Program Files (x86)\», а НЕ в папку «C:\Program Files\». Нам нужно выполнить все инструкции на странице Wiki с заменой этой папки.

(3) Затем вам нужно скомпилировать проект Visual Studio как проект x86.

(4) При компиляции вам необходимо скопировать следующие файлы библиотеки из папки в (2) выше в каталог Debug/Release, в котором выполняется сборка вашего исполняемого файла.

libvlc.dll
libvlc.lib
libvlc.exp

(5) В дополнение к ссылке на заголовочный файл из исходной загрузки вам необходимо добавить «libvlc.lib» в свой проект в:
Project-> Properties-> Linker-> Input-> Additional Dependencies

(6) Также добавьте каталог «C:\Program Files (x86)\VideoLAN\VLC», где находятся копии 3 файлов библиотеки:
Project-> Properties-> Linker-> General-> Additional Library Directors.

(7) Теперь программа должна связать и запуститься без ошибки приложения.

Вышеупомянутая ошибка возникает из-за того, что: (i) программа не может найти, где находится библиотека libvlc.lib для ссылки без настройки VS.
(ii) она не может найти библиотеки для подключения без скопирования 3 файлов библиотек. тот же каталог, в котором создается исполняемый файл проекта.
(iii) Когда он фактически связывается, фактическая DLL в VLC, установленная в «C:\Program Files\», является 64-разрядной версией, тогда как остальная часть вашей программы - x86 .

person Jack    schedule 15.11.2018