热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mac搭建cmake+Qt+ffmpeg开发环境

一.前提环境1.Mac:M111.4arm642.Qt:Qt5.12.7.3.FFmpeg:4.2.2二.遇到的问题1.ld:symbol(s)notfoundforarchite




一.前提环境

1.Mac: M1 11.4 arm64
2.Qt: Qt5.12.7.
3.FFmpeg:4.2.2


二.遇到的问题


1.ld: symbol(s) not found for architecture x86_64

Mac m1默认编译出来的ffmpeg架构是arm64的,而Qt5.12.7编的程序是macx86_64位的,直接在Qt中引入会报错ld: symbol(s) not found for architecture x86_64,所以这里编译ffmpeg版本的时候需要指定arch为x86_64编译。

编译FFmpeg脚本如下:

# Configure
echo Configure for x86_64
./configure \
--disable-x86asm \
--cc=clang \
--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \
--target-os=darwin \
--arch=x86_64 \
--cpu=x86_64 \
--extra-cflags='-arch x86_64 -I/usr/local/include' \
--extra-ldflags='-arch x86_64 -L/usr/local/lib -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk ' \
--enable-cross-compile
#--prefix=mac_x86_64 \
#--disable-swscale-alpha \
#--disable-doc \
#--disable-ffmpeg \
#--disable-ffplay \
#--disable-ffprobe \
#--disable-ffserver \
#--disable-asm \
#--disable-debug \
#--enable-libmp3lame
#
## Make
#make clean
##make
#make && make install

编译完成之后可以用以下命令验证库文件的架构

在这里插入图片描述


2.qt中cmake pkg引入遇到的问题

ffmpeg编译好之后是会有pc文件的,在make install 指定的目录下的lib中,编写简单程序的时候我们可以直接用 pkg-config --libs 库名称 来引入库目录而不需要自己再写-L路径.
在这里插入图片描述

在qt用cmake建立工程,在CmakeLists.txt中引入ffmpeg路径,一开始我是用的pkg-config方式,但是一直报错。

#cmake引入ffmpeg
set(PKG_CONFIG_EXECUTABLE "/opt/homebrew/bin/pkg-config")
find_package(PkgConfig REQUIRED)
pkg_check_modules(ffmpeg REQUIRED IMPORTED_TARGET libavutil)
target_link_libraries(testArch PRIVATE Qt5::Widgets
PkgConfig::ffmpeg)

在这里插入图片描述
这里报错的文件都是ffmpeg依赖的系统文件,一开始我以为是找不到系统文件目录,改了半天,后面还是没法,就放弃用pkg-config这种引入方式了。
改成了直接引入头文件与库文件,如下:

#设置ffmpeg头文件和库路径
set(FFMPEG_PREFIX_PATH /Users/zego/QtProject/testArch/External/FFMPEG/x86_64)
include_directories(
${FFMPEG_PREFIX_PATH}/include/
)
#find_library(AVUTIL_LIBRARY avutil)
FIND_LIBRARY(AVUTIL_LIBRARY avutil ${FFMPEG_PREFIX_PATH}/lib)
target_link_libraries(testArch PRIVATE Qt5::Widgets
${AVUTIL_LIBRARY})

这种方式就能成功编译过。

然后我想为什么直接引入能编译过,为啥用pkg引入的方式不行。想了一下,直接在终端写了个测试文件,引入ffmpeg的文件.
在这里插入图片描述
编译命令为:clang -o ffmpeg_test ffmpeg_test_x86_64.c `pkg-config --libs libavutil` --target=x86_64-apple-darwin

注意这里要加上target,不然会报如下错:

ld: warning: ignoring file /usr/local/lib/libavutil.a, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
Undefined symbols for architecture arm64:

编译结果:
在这里插入图片描述
可以看出编译是通过的,而且可以运行,但是为什么在qt中cmake引入就会报错呢。
接下来是如何解决为什么pkg引入方式不行的处理方法:
第一步:使用set(CMAKE_VERBOSE_MAKEFILE ON )显示执行构建过程中详细的信息,因为qt中默认cmake编译是不打印具体信息的,要找错误我们肯定要看一下具体信息是什么。
第二步:查看直接引入头文件编译成功的打印信息,如下。
在这里插入图片描述
可以看到使用pkgcofig报错找不到的文件在编译过程中是没有出现的,在仔细观察一下,可以看到编译过程中使用了-iframework, -isystem参数,从这里我猜测是不是那些文件已经包含在这里,我们不需要再引入了,为了验证这个猜测,将libavutil.pc依赖的framework都删除掉,然后在qt中进行编译。
在这里插入图片描述

果不其然,编译成功。
在这里插入图片描述

利用clang++ --help查看一下信息:
在这里插入图片描述
在这里插入图片描述
这样子就明白了。



推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • 本文探讨了使用React Native框架开发的应用,在通过AppCenter构建iOS版本时遇到的‘CopyPlistFile’命令失败的问题,并提供了详细的解决方案。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文探讨了在iOS平台上开发BLE(蓝牙低功耗)应用程序时遇到的挑战,特别是如何实现应用在后台模式下仍能持续扫描并连接蓝牙设备。文章提供了具体的配置方法和常见的问题解决方案。 ... [详细]
  • cJinja:C++编写的轻量级HTML模板引擎
    本文介绍了cJinja,这是一个用C++编写的轻量级HTML模板解析库。它利用ejson来处理模板中的数据替换(即上下文),其语法与Django Jinja非常相似,功能强大且易于学习。 ... [详细]
  • QNX 微内核(procnto-instr)的监测版本内置了高级跟踪与分析工具,能够实现实时系统监控。该模块适用于单处理器及多处理器系统。 ... [详细]
  • 本文探讨了Java中char数据类型的特点,包括其表示范围以及如何处理超出16位字符限制的情况。通过引入代码点和代码单元的概念,详细解释了Java处理增补字符的方法。 ... [详细]
author-avatar
皓月当空668
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有