【发布时间】: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