Clion导入FFmpeg编译报错解决

由于业务需要做音视频功能,所以需要c++进行开发,在android studio里编码没有在Clion里爽,所以将FFmpeg的代码集成到Clion里开发,踩了一些坑,记录一下。

FFmpeg先编译用于c/c++环境的静态库,不能用android ndk编译的!

# $HOME/ffmpeg-build是库输出目录
./configure --prefix="$HOME/ffmpeg-build" --bindir="$HOME/bin"

make -j 8
make install

得到.a文件放入工程中

报错信息一:

Undefined symbols for architecture x86_64:
  "_AudioConverterDispose", referenced from:

....

ld: warning: could not create compact unwind for _ff_cfhd_init_vlcs: stack subq instruction is too different from dwarf stack size
Undefined symbols for architecture x86_64:
  "_AudioConverterDispose", referenced from:
      _ffat_close_decoder in libavcodec.a(audiotoolboxdec.o)
      _ffat_close_encoder in libavcodec.a(audiotoolboxenc.o)
  "_AudioConverterFillComplexBuffer", referenced from:
      _ffat_decode in libavcodec.a(audiotoolboxdec.o)
      _ffat_encode in libavcodec.a(audiotoolboxenc.o)
  "_AudioConverterGetProperty", referenced from:
      _ffat_create_decoder in libavcodec.a(audiotoolboxdec.o)
      _ffat_init_encoder in libavcodec.a(audiotoolboxenc.o)
  "_AudioConverterGetPropertyInfo", referenced from:
      _ffat_create_decoder in libavcodec.a(audiotoolboxdec.o)
      _ffat_init_encoder in libavcodec.a(audiotoolboxenc.o)
  "_AudioConverterNew", referenced from:
      _ffat_create_decoder in libavcodec.a(audiotoolboxdec.o)
      _ffat_init_encoder in libavcodec.a(audiotoolboxenc.o)
  "_AudioConverterReset", referenced from:
      _ffat_decode_flush in libavcodec.a(audiotoolboxdec.o)
      _ffat_encode_flush in libavcodec.a(audiotoolboxenc.o)
  "_AudioConverterSetProperty", referenced from:
      _ffat_create_decoder in libavcodec.a(audiotoolboxdec.o)
      _ffat_init_encoder in libavcodec.a(audiotoolboxenc.o)
  "_AudioFormatGetProperty", referenced from:
      _ffat_create_decoder in libavcodec.a(audiotoolboxdec.o)
  "_AudioFormatGetPropertyInfo", referenced from:
      _ffat_create_decoder in libavcodec.a(audiotoolboxdec.o)
  "_CFArrayCreate", referenced from:
      _vtenc_create_encoder in libavcodec.a(videotoolboxenc.o)
  "_CFArrayCreateMutableCopy", referenced from:
      _tls_open in libavformat.a(tls_securetransport.o)
  
...

解决方法:

几个需要 库需要导入:AudioToolBox  CoreGraphics CoreMedia OpenGLles QuartCore openal  mediaToolbox VideoToolBox accelerate

CMakeLists.txt加上

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v -stdlib=libc++ -framework OpenGL -framework AppKit -framework Security -framework CoreFoundation -framework CoreVideo -framework CoreMedia -framework QuartzCore -framework CoreFoundation -framework VideoDecodeAcceleration -framework Cocoa -framework AudioToolbox -framework VideoToolbox -framework OpenCL ")

报错信息二:

Undefined symbols for architecture x86_64:
  "_BZ2_bzDecompress", referenced from:
      _matroska_decode_buffer in libavformat.a(matroskadec.o)
  "_BZ2_bzDecompressEnd", referenced from:
      _matroska_decode_buffer in libavformat.a(matroskadec.o)
  "_BZ2_bzDecompressInit", referenced from:

ld: warning: could not create compact unwind for _ff_cfhd_init_vlcs: stack subq instruction is too different from dwarf stack size
Undefined symbols for architecture x86_64:
  "_BZ2_bzDecompress", referenced from:
      _matroska_decode_buffer in libavformat.a(matroskadec.o)
  "_BZ2_bzDecompressEnd", referenced from:
      _matroska_decode_buffer in libavformat.a(matroskadec.o)
  "_BZ2_bzDecompressInit", referenced from:
      _matroska_decode_buffer in libavformat.a(matroskadec.o)
  "_iconv", referenced from:
      _avcodec_decode_subtitle2 in libavcodec.a(decode.o)
      _getstr8 in libavformat.a(mpegts.o)
  "_iconv_close", referenced from:
      _avcodec_open2 in libavcodec.a(utils.o)
      _avcodec_decode_subtitle2 in libavcodec.a(decode.o)
      _getstr8 in libavformat.a(mpegts.o)
  "_iconv_open", referenced from:
      _avcodec_open2 in libavcodec.a(utils.o)
      _avcodec_decode_subtitle2 in libavcodec.a(decode.o)
      _getstr8 in libavformat.a(mpegts.o)
ld: symbol(s) not found for architecture x86_64

解决方法:CMakeLists.txt里 target_link_libraries加上

target_link_libraries(
        libbz2.dylib
        libiconv.dylib
)

附一份完整的CMakeLists.txt

cmake_minimum_required(VERSION 3.19)
project(c)

#指定c++库 版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v -stdlib=libc++ -framework OpenGL -framework AppKit -framework Security -framework CoreFoundation -framework CoreVideo -framework CoreMedia -framework QuartzCore -framework CoreFoundation -framework VideoDecodeAcceleration -framework Cocoa -framework AudioToolbox -framework VideoToolbox -framework OpenCL ")

set(INC_DIR ./include)
set(LINK_DIR ./lib)


#file(GLOB native_srcs
#        "*.cpp"
#        "include/*.cpp"
#        )
#add_library( # Sets the name of the library.
#        code
#        SHARED
#        ${native_srcs}
#        )

set(SOURCE_FILES
        main.cpp
        )



#引入头文件
include_directories(${INC_DIR})
#引入库文件
link_directories(${LINK_DIR})

add_executable(c ${SOURCE_FILES})

include_directories(src/main/cpp/include)


target_link_libraries(
        c
#        avcodec avformat avutil swresample swscale swscale avfilte
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libavfilter.a
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libavformat.a
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libavcodec.a
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libswscale.a
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libavutil.a
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libswresample.a

#        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libavfilter.so
#        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libavformat.so
#        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libavcodec.so
#        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libavutil.so
#        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libswresample.so
#        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libswscale.so
        z #z库 ffmpeg用到

        #bz2库
        libbz2.dylib
        libiconv.dylib
)

cpp引用.h时,需要用extern "C"包起来,不然编译不过

#include <iostream>

#include <string>

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

#include "include/libavutil/file.h"
#include "include/libavutil/mathematics.h"
#include "include/libavutil/time.h"
#include "include/libavutil/mem.h"
#include "include/libswresample/swresample.h"
}

AVFormatContext *inputContext = nullptr;
AVFormatContext *outputContext;
int64_t lastReadPacktTime;


void Init() {
    //av_register_all();
    //avfilter_register_all();
    avformat_network_init();
    av_log_set_level(AV_LOG_ERROR);
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    Init();
    return 0;
}

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果您在使用 CLion 编译 Qt 程序时遇到错误,请检查以下内容: 1. 确保已经安装了 Qt 库和相关的开发工具,并已正确配置环境变量。 2. 检查代码是否有语法错误,是否有找不到的头文件和未定义的符号。 3. 确保 CLion 已经正确配置了 Qt 库路径,并使用了正确的编译器。 4. 检查是否在项目文件中包含了正确的 qmake 文件。 如果以上步骤都无法解决问题,请在问题发生时的错误信息,以及代码的相关部分提供给我,我将尽力为您解答。 ### 回答2: 在使用CLion编译Qt程序时,常见的错误有很多种,下面列举一些可能遇到的问题和解决方法。 1. 编译器选择错误:CLion默认使用CMake来构建项目,但Qt通常使用qmake构建项目。需要在CMakeLists.txt中添加相关Qt模块的库和头文件路径。 2. Qt模块缺失:CLion可能无法找到Qt的一些模块,导致编译错误。需要在CMakeLists.txt中添加相关的模块。 3. Qt版本不匹配:如果您的项目使用的Qt版本与CLion支持的版本不匹配,可能会导致编译错误。请确保您的Qt版本与CLion兼容。 4. 编译器标志设置错误:有时,编译器标志设置不正确也会导致编译错误。请检查您的CMakeLists.txt文件中的编译器标志设置是否正确。 5. 缺少库文件:如果项目依赖于某些库文件,但CLion无法找到这些文件,可能会导致编译错误。请确保库文件正确安装,并在CMakeLists.txt文件中添加相关的库路径。 以上是一些常见的CLion编译Qt程序报错的问题及解决方法,希望对您有帮助。如果还有其他问题,请提供具体错误信息以便进一步排查。 ### 回答3: 要回答关于CLion编译QT程序报错的问题,首先我们需要了解报错的具体内容。不同的报错可能对应着不同的问题。 首先,我们需要确保在CLion中正确设置了QT的路径。在CLion的设置中,找到"Build, Execution, Deployment",然后选中"Toolchains"。确保你已经正确地设置了QT的路径。同时,确保你已经在CMakeLists.txt文件中包含了正确的QT模块。 其次,检查报错信息中提到的具体问题。报错信息可能会有诸如未定义的引用、找不到头文件等等。根据报错信息,逐一解决问题。你可能需要检查你的代码中是否有语法错误,或者是否正确地引入了需要的头文件。 如果报错信息中包含了特定的函数或类,可以在QT官方文档中查找该函数或类的定义和用法。确保你正确地使用了这些函数或类。 此外,还可以尝试清除CLion的缓存并重新编译项目。有时候缓存可能会导致一些奇怪的问题。 最后,如果以上步骤都没有解决问题,可以尝试在相关的编译器环境下手动编译和运行代码。通过这种方式,你可以更直观地看到报错信息,并更容易找到问题所在。 总之,解决CLion编译QT程序报错的方法需要根据具体的报错信息来确定。通过逐一检查代码、设置和环境,通常能够找到解决问题的办法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值