visual-studio - MSVC fatal error LNK1120 : 1 unresolved externals with FFMPEG libs

标签 visual-studio ffmpeg cmake

我正在尝试在自己的程序中使用 ffmpeg 库,但无法链接它们。具体来说,在我的基本程序中,我收到了 fatal error LNK1120: 1 unresolved externals错误。该程序是:

#include <iostream>
#include <libswresample/swresample.h>

int main()
{
    std::cout << "Hello World!\n";
    struct SwrContext* swr_ctx = swr_alloc();
    if (!swr_ctx) {
        std::cout << "Could not allocate resampler context";
    }
}

我从 https://ffmpeg.zeranoe.com/builds/ 下载了预编译库,特别是包含 .def/.lib 以及 .dll 文件的 Windows x64 开发包。

我最初尝试(并打算最终使用)cmake 来生成 MSVC sln 文件。 cmake文件是:
cmake_minimum_required(VERSION 3.5)

project(ffmpeg_jni)

# Find the JNI bits
find_package(JNI)

# Search for the ffmpeg libraries
set(ffmpeg_include_hint "ffmpeg-dev/include")
set(ffmpeg_lib_hint "ffmpeg-dev/lib")

find_path(SWRESAMPLE_INCLUDE_DIR libswresample/swresample.h PATHS ${ffmpeg_include_hint})
find_library(SWRESAMPLE_LIBRARY swresample PATHS ${ffmpeg_lib_hint})
add_library(swresample SHARED IMPORTED)
set_target_properties(swresample PROPERTIES
    IMPORTED_LOCATION "${SWRESAMPLE_LIBRARY}"
    IMPORTED_IMPLIB "${SWRESAMPLE_LIBRARY}"
    INTERFACE_INCLUDE_DIRECTORIES "${SWRESAMPLE_INCLUDE_DIR}"
)

# Setup basic include dirs
set(includeDIRS
        src/main/cpp
        ${JAVA_INCLUDE_PATH})

# Setup windows specific includes
set(includeDIRS
        ${includeDIRS}
        ${JAVA_INCLUDE_PATH}/Win32)

include_directories(${includeDIRS})

set(WRAPPER_SRC
        src/main/cpp/logging.c
        src/main/cpp/logging.h
        src/main/cpp/main.cpp)

add_library(ffmpeg_jni SHARED ${WRAPPER_SRC})
target_link_libraries(ffmpeg_jni PRIVATE swresample)

生成的解决方案可以编译并且可以正确访问包含文件(Visual Studio 甚至可以带我去声明)。问题出现在我收到的构建的链接阶段:

error LNK2019: unresolved external symbol "struct SwrContext * __cdecl swr_alloc(void)" (?swr_alloc@@YAPEAUSwrContext@@XZ) referenced in function main



考虑到我在 cmake 中可能有问题,因为我对它还是很陌生,所以我尝试按照我在无数在线演示中为项目添加外部库的方法制作一个简单的演示作为纯 Visual Studio 项目。具体包括:
  • 将包含头文件的目录添加到 Properties->C/C++->General->Additional Include Directories
  • 将包含 .lib 文件的目录添加到 Properties->Linker->General->Additional Library Directories(注意,cmake 路径没有这样做,而是通过相对路径添加了 lib 文件)
  • 将 .lib 文件添加到 Properties->Linker->Input->Additional Dependencies

  • 在这一点上,我进行的任何搜索工作都向我展示了不同的人在做同样的事情,这告诉我我已经看太久了,无法自己找到答案,而且我错过/不理解的一些微不足道的东西。

    最佳答案

    如果您将项目编译为 c++,则包含 FFmpeg 头文件,如下所示,它告诉您的 c++ 编译器将 FFmpeg 头文件作为 C 而不是 C++ 处理。

    extern "C" {
    #include <libswresample/swresample.h>
    }
    

    关于visual-studio - MSVC fatal error LNK1120 : 1 unresolved externals with FFMPEG libs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57518677/

    相关文章:

    C++ Boost 程序选项崩溃

    visual-studio - 使用 pfx 和 Visual Studio 签署具有强名称的程序集

    c++ - 条件断点在不应触发时触发

    c++ - g++ 的 ifstream 错误,但使用 Visual Studio 编译

    visual-studio-2010 - 无法加载文件 %CommonDir%\publish.tlb

    linux - FFMPEG 在一个命令行中将图像与视频和流结合起来

    ffmpeg - 使用 ffmpeg 尝试示例程序导致链接器错误

    php - 找到ffmpeg的绝对路径

    PHP - 使用 ffmpeg 将图像转换为视频

    c++ - Eclipse 运行-->断点类型-->无可用