【问题标题】:Link FFmpeg with CMake on Windows在 Windows 上将 FFmpeg 与 CMake 链接
【发布时间】:2021-09-16 04:55:26
【问题描述】:

我是 CMake 的新手,这几天我一直在摸不着头脑。我下载了 FFmpeg 源代码并毫无问题地构建了它。我有一个 lib 文件夹和一个包含在我的项目结构中的文件夹:

project
   \--- build
   \--- dep
      \---ffmpeg
         \--- include
         \--- lib
   main.cpp
   CMakeLists.txt

这是我的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.19)
project(VidShare)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(VidShare main.cpp)
include_directories(dep/ffmpeg/include)
target_link_libraries(VidShare
        ${CMAKE_SOURCE_DIR}/dep/ffmpeg/lib/libavformat.a
        ${CMAKE_SOURCE_DIR}/dep/ffmpeg/lib/libavcodec.a)

这是我的 main.cpp:

extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
}

#include <iostream>

int main() {
    AVFormatContext *pFormatContext = avformat_alloc_context();
    return 0;
}

添加这行代码后:AVFormatContext *pFormatContext = avformat_alloc_context(); 在 CLion 中构建时出现此错误:

[ 50%] Linking CXX executable VidShare.exe
CMakeFiles\VidShare.dir/objects.a(main.cpp.obj): In function `main':
D:/Users/dalla/Documents/Coding Projects/C++/VidShare/main.cpp:9: undefined reference to `avformat_alloc_context'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [CMakeFiles\VidShare.dir\build.make:107: VidShare.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:94: CMakeFiles/VidShare.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:101: CMakeFiles/VidShare.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:136: VidShare] Error 2

我猜这是一个链接器错误,我不知道如何正确链接它(可能是我遗漏的一些愚蠢的东西),因为 avformat_alloc_context() 似乎在头文件中。无论如何,我很绝望,希望能得到一些帮助。

我正在使用:

  • MinGW
  • 克利翁
  • Windows 10
  • CMake

【问题讨论】:

  • 您的 CMake 规则未遵循最佳实践。您应该让 CMake 找出库的扩展,而不是自己提供它们。此外,您应该使用target_link_directory 为CMake 提供搜索库的目录,而不是在target_link_library 中重复提供完整路径。
  • 您能否将此存储库放置在可访问的地方,以便我可以尝试自己构建它?
  • @Nahiyan 我尝试通过删除扩展名并使用target_link_directory 来修改我的CMakeLists.txt,现在我收到一个关于skipping incompatible libavformat.a when searching for -lavformat 的错误消息。我不得不承认我不确定如何使用 target_link_directory。无论如何,我已经在 Dropbox 中上传了原始项目的 zip 文件,这是链接:dropbox.com/sh/7oqho0gsnw66lex/AADb7XWynT1JWtM_LsDRQB99a?dl=0。感谢您的宝贵时间
  • 我发布了我的答案。介意分享一下你是如何获得二进制文件的吗?
  • 我还从源代码编译了 FFmpeg 库,替换了您提供的库,从而解决了问题。

标签: c++ ffmpeg cmake linker mingw


【解决方案1】:

我成功地在 Ubuntu 20.04 上使用 libavcodeclibavformat 构建了这个项目。我只是运行sudo apt install libavformat-dev libavcodec-dev 来安装avformatavcodec 的开发库。至于查找库(在我的例子中是/usr/lib/x86_64-linux-gnu),我使用了CMake的find_library函数。

这就是您的 CMake 文件的样子:

cmake_minimum_required(VERSION 3.19)
project(VidShare)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(VidShare main.cpp)
include_directories(${CMAKE_SOURCE_DIR}/dep/ffmpeg/include)
find_library(AVFORMAT_LIB avformat)
find_library(AVCODEC_LIB avcodec)
target_link_libraries(VidShare ${AVFORMAT_LIB} ${AVCODEC_LIB})

我相信由于某种原因,链接器无法成功加载您dep/ffmpeg/lib 目录中的库。我使用 GNU nm 列出了符号,但找不到任何意外或丢失的东西。尽管如此,最好还是尽可能使用官方预编译的二进制文件。

【讨论】:

  • 我会使用预编译的二进制文件,但我不知道如何在 Windows 上找到它们。但是我今天发现了这个名为 vcpkg 的工具并从那里安装了 .lib 文件,我现在正尝试使用 vcpkg 设置所有内容。我认为我自己构建的库可能是问题所在......
  • 我明白了。您可以尝试使用 MSVC 来编译它们而不是 MinGW 吗?
  • 使用静态下载我得到未定义的引用。我下载了动态构建来尝试。该项目编译得很好,但是当我运行可执行文件时,我得到了这个退出代码:-1073741515 (0xC0000135) 这意味着我认为缺少一些 .dll ......这在 MSVC 和 MinGW 上都会发生
  • 我已经在我的系统路径变量中添加了 .dll 文件,它现在似乎工作正常。但是我宁愿使用静态链接...知道如何实现吗?现在动态适用于 MinGW 和 MSVC。顺便说一句,非常感谢您的帮助:)
  • 对于动态链接的版本,能否请您使用依赖遍历器,看看它报告了什么?它应该能够帮助您识别丢失的 DLL[s]。这可能有助于我们解决静态链接问题。
猜你喜欢
  • 2020-07-13
  • 2018-01-22
  • 2018-10-23
  • 2021-02-13
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多