我刚开始接触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()似乎在头文件中。不管怎样,我很绝望,我会很感激你的帮助。
我正在使用:
发布于 2021-07-06 14:25:59
我成功地在Ubuntu20.04上使用libavcodec
和libavformat
构建了这个项目。我只是运行sudo apt install libavformat-dev libavcodec-dev
来安装avformat
和avcodec
的开发库。至于查找库(在我的例子中是/usr/lib/x86_64-linux-gnu
),我使用了CMake的图书馆函数。
这就是您的CMake文件的样子:
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(${CMAKE_SOURCE_DIR}/dep/ffmpeg/include)
find_library(AVFORMAT_LIB avformat)
find_library(AVCODEC_LIB avcodec)
target_link_libraries(VidShare ${AVFORMAT_LIB} ${AVCODEC_LIB})
我相信您的dep/ffmpeg/lib
目录中的库由于某种原因无法被链接器成功地加载。我使用GNU nm列出符号,但没有发现任何意外或丢失的东西。尽管如此,在可能的情况下使用正式的预编译二进制文件始终是最佳实践。
https://stackoverflow.com/questions/68255631
复制相似问题