Неопределенная ссылка на «libvlc_new», но правильно связана?

Я хочу использовать библиотеку VLC в проекте на основе ROS с использованием C++. Я использую QT Creator в качестве редактора кода.

Я попытался следовать следующему руководству, чтобы реализовать простое воспроизведение mp3-файла: Простая программа на C для воспроизведения mp3 с помощью libvlc

Since then I'm getting the following exceptions:
undefined reference to `libvlc_new'
undefined reference to `libvlc_media_new_path'
undefined reference to `libvlc_media_player_new_from_media'
undefined reference to `libvlc_media_release'
undefined reference to `libvlc_media_player_play'
undefined reference to `libvlc_media_player_stop'
undefined reference to `libvlc_media_player_release'
undefined reference to `libvlc_release'
collect2: ld returned 1 exit status
make[2]: *** [../bin/my_face_tracker_demo] Error 1
make[1]: *** [CMakeFiles/my_face_tracker_demo.dir/all] Error 2
make: *** [all] Error 2
The process "/usr/bin/make" exited with code 2.
Error while building project my_qbo_interaction (target: Desktop)
When executing build step 'Make'

Конечно, я добавил #include "vlc/vlc.h" в файл. Кроме того, я следовал инструкциям чтобы убедиться, что я добавляю ссылки для компоновщика. Вот что я добавил в файл cmakelist.txt:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
find_package(LIBVLC REQUIRED)
include_directories(${LIBVLC_INCLUDE_DIRS})
set(LIBS ${LIBS} ${LIBVLC_LIBRARIES})

make может скомпилировать файл. Он также может найти библиотеки LIBVLC. Вот часть вывода make:

-- Найден путь include-dir для LibVLC: /usr/include -- Найден путь к библиотеке LibVLC:/usr/lib/libvlc.so -- Найден путь к библиотеке LibVLCcore:/usr/lib/libvlccore.so -- Найдена версия LibVLC: 1.1 .12 (искано: 0.0) -- Настройка завершена -- Генерация завершена Предупреждение CMake: заданные вручную переменные не использовались проектом:

CMAKE_TOOLCHAIN_FILE

Но я все еще получаю вышеуказанные сообщения об ошибках... Кто-нибудь может мне помочь?


person stromflut    schedule 07.05.2013    source источник


Ответы (2)


Похоже, что библиотеки VLC были найдены правильно, но вам нужно связать их с вашим исполняемым файлом.

Это можно сделать с помощью target_link_libraries команда. Например:

set(LIBS ${LIBS} ${LIBVLC_LIBRARIES})
add_executable(MyExe ${TheSources})
target_link_libraries(MyExe ${LIBS})
person Fraser    schedule 07.05.2013
comment
Это уже кажется неплохим. Я просто очень новичок в мире C++/Linux. Как мне установить MyExe и другие переменные? Пробовал добавить следующее: add_executable(LIBVLC ${CMAKE_SOURCE_DIR}) target_link_libraries(LIBVLC ${LIBVLC_LIBRARIES}) Не помогло :-( - person stromflut; 08.05.2013
comment
Ах да. Команда add_executable принимает имя вашего exe в качестве первого аргумента, тогда ему нужен список исходных файлов, которые будут скомпилированы в exe. В вашем примере вы передаете путь к корню вашего проекта в виде списка файлов — ${CMAKE_SOURCE_DIR} — это каталог, в котором находится ваш файл CMakeLists.txt верхнего уровня! Кроме того, LIBVLC — довольно странное имя для исполняемого файла — я бы порекомендовал вам изменить и его :-) В любом случае, вам нужно иметь что-то вроде add_executable(MyExe src/main.cpp) - person Fraser; 08.05.2013
comment
Если у вас есть несколько файлов для компиляции в exe, просто перечислите их все. Вы можете собрать их в переменную (например, ${TheSources} в моем примере). например set(TheSources src/a.cpp src/b.cpp src/main.cpp), затем add_executable(MyExe ${TheSources}). - person Fraser; 08.05.2013
comment
Я не мог заставить это работать, я нашел другое решение, которое мне подходит: системный вызов mpg321 для воспроизведения звука. все равно спасибо за помощь! - person stromflut; 15.05.2013

Это может быть вызвано несоответствием архитектуры. Подробнее см. мой ответ здесь.

person hacker1024    schedule 08.10.2020