引言:
小白打算在Windows平台下用Vscode引入第三方的FFMpeg、SDL2的动态库(即.dll、.lib),制作一个简易的音、视频播放器,项目的构建用CMake插件实现(不喜欢C++插件的三个.json配置文件,试了一下感觉好麻烦,而且CMake可以跨平台,方便后续在其它平台快速入门项目构建)。
构建过程中在链接阶段遇到了问题,花了不少时间才解决。当时在网上搜索的时候基本上都是关于VS相关问题的回答,关于VC的很少,因此发此文看看能不能帮助到未来遇到类似问题的朋友。
遇到的问题:
***.obj : error LNK2019:无法解析的外部符号 _av_malloc,函数 _main 中引用了该符号
类似错误往下还有几十项。
问题分析:
已经得到了目标文件,但是在链接阶段无法定位到av_malloc()函数实现的位置,即lib库链接出错了。
网上大部分的回答是路径错误,或是dll、lib、.h文件的版本不一致所致,但经排查后确定不是这些原因。实际原因为构建工具包系统版本 与 lib文件系统版本不一致所致,从官网下载得到的lib版本为x64版本,而我使用的工具包为MSVCx86版本(),因此链接阶段出现了问题(但我不明白为什么直到链接阶段才出了问题)。
解决方法:
很简单,工具包换成x64版本的就行了,我的选择是MinGW-w64。
CMakeList.txt:
cmake_minimum_required(VERSION 3.20.0)
# 项目名称
project(ChuVideoPlayer VERSION 0.1.0 LANGUAGES C CXX)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)
# 设置可执行文件的输出路径
add_executable(ChuVideo ffmpeg_ChuPlayer.cpp)
# 创建可执行文件
target_include_directories(ChuVideo PUBLIC ${CMAKE_SOURCE_DIR}/inc)
# 向编译目标提供头文件路径 (PS:对比include_directories的全局目标添加,这个可以选择单一目标添加)
target_link_directories(ChuVideo PUBLIC ${CMAKE_SOURCE_DIR}/lib)
# 向目标提供库文件的路径
target_link_libraries(ChuVideo PUBLIC
avcodec.lib
avformat.lib
avutil.lib
swscale.lib
SDL2.lib
)# 向目标提供需要链接的库文件名(可以不写.lib,我只是强调是lib库)
思路提供:无法解析的外部符号解决方法汇总