【问题标题】:Undefined reference to 'libvlc_new" but linked correctly?对“libvlc_new”的未定义引用但正确链接?
【发布时间】:2023-03-16 19:42:02
【问题描述】:

我想在使用 C++ 的基于 ROS 的项目中使用 VLC 库。我正在使用 QT Creator 作为代码编辑器。

我尝试按照下面的教程来实现一个mp3文件的简单播放:A simple C program to play mp3 using 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"。此外,我关注the instructions 以确保我添加了链接器的引用。这是我添加到 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 的一部分输出:

-- 找到 LibVLC include-dir 路径:/usr/include -- 找到LibVLC库路径:/usr/lib/libvlc.so -- 找到LibVLCcore库路径:/usr/lib/libvlccore.so -- 找到 LibVLC 版本:1.1.12(搜索:0.0) -- 配置完成 -- 生成完成的 CMake 警告:项目未使用手动指定的变量:

CMAKE_TOOLCHAIN_FILE

但我仍然收到上述错误消息...有人可以帮助我吗?

【问题讨论】:

    标签: c++ linux qt cmake ros


    【解决方案1】:

    看起来 VLC 库已正确找到,但您需要将它们实际链接到您的可执行文件中。

    您可以通过target_link_libraries 命令执行此操作。例如:

    set(LIBS ${LIBS} ${LIBVLC_LIBRARIES})
    add_executable(MyExe ${TheSources})
    target_link_libraries(MyExe ${LIBS})
    

    【讨论】:

    • 这看起来已经很不错了。我对 C++/Linux 世界还很陌生。如何设置“MyExe”和其他变量?我尝试添加以下内容: add_executable(LIBVLC ${CMAKE_SOURCE_DIR}) target_link_libraries(LIBVLC ${LIBVLC_LIBRARIES}) 没有帮助:-(
    • 对了。 add_executable 命令将您的 exe 名称作为第一个参数,然后它需要将要编译到 exe 中的源文件列表。在您的示例中,您将项目根目录的路径作为文件列表传递 - ${CMAKE_SOURCE_DIR} 是您的顶级 CMakeLists.txt 所在的目录!此外,“LIBVLC”对于可执行文件来说是一个很奇怪的名称——我建议你也改一下 :-) 无论如何,你需要有类似 add_executable(MyExe src/main.cpp) 的名称
    • 如果你有几个文件要编译成exe,把它们都列出来。您可以将它们收集到一个变量中(例如我的示例中的${TheSources})。例如set(TheSources src/a.cpp src/b.cpp src/main.cpp) 然后add_executable(MyExe ${TheSources})
    • 我无法让它工作,我找到了一个适合我的不同解决方案:系统调用 mpg321 来播放声音。无论如何感谢您的帮助!
    【解决方案2】:

    这可能是由架构不匹配引起的 - 您可以查看我的回答 here 了解更多详细信息。

    【讨论】:

      【解决方案3】:

      我想做同样的事情。对于其他陷入困境的人。

      复制https://github.com/vlc-qt/vlc-qt/blob/master/cmake/FindLIBVLC.cmake 并将其放入项目根目录下的新目录 cmake/Modules 中。

      cmake 然后应该使用:

      set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
      find_package(LIBVLC REQUIRED)
      

      如果你从上面检查 FindLIBVLC.cmake 目录的名称不是

      include_directories(${LIBVLC_INCLUDE_DIRS})
      set(LIBS ${LIBS} ${LIBVLC_LIBRARIES})
      

      他们是:

      ${LIBVLC_INCLUDE_DIR} and ${LIBVLC_LIBRARY}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-13
        • 2016-09-19
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        • 2011-12-08
        • 2020-11-06
        • 2014-08-20
        相关资源
        最近更新 更多