Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
 Аватар для Serpico
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 157

Как настроить CMake для поиска библиотек FFmpeg

30.03.2022, 07:35. Показов 4886. Ответов 8

Студворк — интернет-сервис помощи студентам
Мало понимаю в разработке под Linux и CMake, поэтому делаю пока что как привык для Windows.
Не могу разобраться использовать сторонние библиотеки.

Я пытаюсь собрать приложение с использованием ffmpeg библиотек. Скачал shared библиотеки (ffmpeg-n4.4-latest-linux64-gpl-shared-4.4.tar.xz).
Структура проекта такая:
Code
1
2
3
4
5
6
7
<root folder>
ffmpeg/
 ├ include/
 ├ lib/
src
 ├ CMakeLists.txt
 ├ main.cpp
Написал такой CMakeLists:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
cmake_minimum_required(VERSION 3.0.0)
project(ffmpeg_test VERSION 0.2.0)
 
#путь до выходного файла
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../bin)
 
list(APPEND SOURCES
    main.cpp   
)
 
set(FFmpeg_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../ffmpeg)
 
#ищем все библиотеки в пути FFmpeg_ROOT
foreach (lib "avformat" "avcodec" "swresample" "swscale" "avutil")
 
        # Library files
        find_library(${lib}_LIB NAMES "${lib}" PATHS ${FFmpeg_ROOT}/lib)
        if (NOT ${lib}_LIB)
                message(FATAL_ERROR "Could not find release version of library "${lib}"")
        else()
            list(APPEND FFMPEG_LIBRARIES  "${${lib}_LIB}")
            message("${lib}:    ${${lib}_LIB}")
        endif()
 
endforeach()
 
 
 
add_executable(ffmpeg_test ${SOURCES})
 
target_include_directories(ffmpeg_test  PRIVATE ${FFmpeg_ROOT}/include)
target_link_libraries(ffmpeg_test PRIVATE ${FFMPEG_LIBRARIES})
Всё собирается. Но при запуске:

Code
1
./ffmpeg_test: symbol lookup error: /home/ilya/src/ffmpeg-test/ffmpeg/lib/libavcodec.so.58: undefined symbol: av_film_grain_params_create_side_data, version LIBAVUTIL_56
Не понимаю в чём проблема. Расположил рядом с бинарником .so библиотеки в bin директорию.
Если я правильно понял, то программа не понимает где искать ему библиотеки. Прочитал про LD_LIBRARY_PATH.
Сделал так в терминале:
export LD_LIBRARY_PATH=/home/ilya/src/ffmpeg-test/bin
Таким способом заработало. В общем я не могу разобраться как в линуксе поиск библиотек происходит и что с этим делать всем.

Добавлено через 2 минуты
Кстати если посмотреть через ldd какие у него зависимости:
Code
1
2
3
4
5
6
7
8
9
10
11
12
$ ldd ./ffmpeg_test
    linux-vdso.so.1 (0x00007ffe9a1f5000)
    libavcodec.so.58 => /home/ilya/src/ffmpeg-wrapper/ffmpeg/lib/libavcodec.so.58 (0x00007f581ef56000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f581ed73000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f581ebae000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f581ea6a000)
    libswresample.so.3 => /lib/x86_64-linux-gnu/libswresample.so.3 (0x00007f581ea48000)
    libavutil.so.56 => /lib/x86_64-linux-gnu/libavutil.so.56 (0x00007f581e787000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f581e763000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f581e75d000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f581e752000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5823fb0000)
Странно что libavcodec он использует локальную. а зависимые от неё libswresample и libavutil в системе
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.03.2022, 07:35
Ответы с готовыми решениями:

Как настроить поля для поиска по названию
Здравствуйте, подскажите пожалуйста как настроить (создать) поле в форме, что оно искало по названию

CMake, построение библиотек
Как с помощью CMake строить динамическую и статическую библиотеку при этом не используя для этого 2 проекта в одном решении?

Ffmpeg конфликт библиотек
В проекте возникает потребность пользоваться одновременно (или хотя бы поочерёдно) этими библиотеками #include...

8
Windows must die
676 / 859 / 103
Регистрация: 23.11.2021
Сообщений: 5,079
Записей в блоге: 18
30.03.2022, 09:22
Цитата Сообщение от Serpico Посмотреть сообщение
Скачал shared библиотеки (ffmpeg-n4.4-latest-linux64-gpl-shared-4.4.tar.xz).
Забудь про мастдайкоориентированный подход! У тебя в дистре есть менеджер пакетов, вот им и пользуйся!!!1111
А дальше все элементарно:
Code
1
2
set(MODULES libavformat libavcodec libswscale libavutil libavdevice)
pkg_check_modules(${PROJ} REQUIRED ${MODULES})
И при помощи pkg-config все будет найдено.
0
 Аватар для Serpico
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 157
30.03.2022, 13:03  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
У тебя в дистре есть менеджер пакетов, вот им и пользуйся
как? что именно поставить?
я поставил ffmpeg: apt install ffmpeg
и теперь такое:

Code
1
2
3
4
5
6
7
8
9
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") 
-- Checking for modules 'libavformat;libavcodec;libswscale;libavutil;libavdevice'
--   No package 'libavformat' found
--   No package 'libavcodec' found
--   No package 'libswscale' found
--   No package 'libavutil' found
--   No package 'libavdevice' found
-- Configuring done
-- Generating done
0
Windows must die
676 / 859 / 103
Регистрация: 23.11.2021
Сообщений: 5,079
Записей в блоге: 18
30.03.2022, 13:38
Цитата Сообщение от Serpico Посмотреть сообщение
что именно поставить?
У меня, например, это просто media-video/ffmpeg. Что там в бубунтах — знать не знаю и не хочу! Я мастдайкой предпочитаю не пользоваться.
Но, насколько помню, мейнейнеры бубунты — те еще дегенераты. И они разделили все пакеты на два-три. Библиотеки делятся минимум на 2 (маразм, но таки): lib-пакет и dev-пакет (во втором заголовочные файлы, как будто бы без них можно библиотеки использовать! Дебилы, блин!!!).
Цитата Сообщение от Serpico Посмотреть сообщение
и теперь такое
Ну так надо же еще dev-пакет поставить. Если все установлено правильно, то можно проверить, скажем:
Code
1
2
pkg-config --libs --cflags libavformat libavcodec libswscale libavutil libavdevice
-lavformat -lavcodec -lswscale -lavutil -lavdevice
0
 Аватар для Serpico
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 157
30.03.2022, 13:48  [ТС]
Я честно говоря ничего не понял из ваших объяснений. Почему я не могу скачать готовые билды библиотеки и использовать их? чем они отличаются тем что будет из менеджера пакетов ?
0
Windows must die
676 / 859 / 103
Регистрация: 23.11.2021
Сообщений: 5,079
Записей в блоге: 18
30.03.2022, 14:14
Цитата Сообщение от Serpico Посмотреть сообщение
чем они отличаются тем что будет из менеджера пакетов ?
Тем, что они будут собраны невесть с чем и размещены невесть где.
А компилять из исходников — совсем уж не true-way, когда все есть в репах дистра!!1111

И да, крайне рекомендую использовать вменяемый дистрибутив для разработчика: Calculate или Gentoo. В отличие это всяких мастдаек, его мейнтейнеры не считают пользователя дегенератом, о которого можно ноги вытирать!
0
 Аватар для Serpico
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 157
30.03.2022, 14:48  [ТС]
Оставьте своё мнение при себе. Кому чем удобнее. А иногда даже выбирать не приходится.

Добавлено через 30 минут
так я попытался сделать через pkg-config. но теперь он вообще не компилирует:
Code
1
2
3
4
5
6
/usr/bin/ld: CMakeFiles/ffmpeg_test.dir/main.cpp.o: в функции «main»:
main.cpp:(.text+0x9): неопределённая ссылка на «avcodec_configuration»
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/ffmpeg_test.dir/build.make:84: /home/ilya/bin/ffmpeg_test] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/ffmpeg_test.dir/all] Ошибка 2
make: *** [Makefile:84: all] Ошибка 2
код такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
extern "C"
{
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>
}
 
#include <iostream>
 
int main()
{
    std::cout << avcodec_configuration() << std::endl;
    return 0;
}
0
Windows must die
676 / 859 / 103
Регистрация: 23.11.2021
Сообщений: 5,079
Записей в блоге: 18
30.03.2022, 16:09
Serpico, ты всю строчку напиши, как скомпилировать пытаешься! Потому как ты стопудово не указываешь, какие нужно библиотеки подключить.

Добавлено через 1 минуту
Вот, у меня все работает с твоим файлом:
Code
1
2
3
4
g++ 1.cpp `pkg-config --libs libavformat libavcodec` -o test
 
./test 
--prefix=/usr --libdir=/usr/lib64 ...
P.S. а если "выбирать не приходится", то нужно как можно быстрей драпать с такой паршивой работы!!! Если что, Calculate входит в росреестр, так что можно смело всякое говно вроде альтлинуксов или астралинуксов заменить на вменяемый GNU/Linux.
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
30.03.2022, 17:07
Serpico, привет собрату по пересаживанию с винды на линуксы. Хоть меня это не накрыло ещё в полной мере, но уже приходится понемногу разбираться. Советы линукс-гуру в подобных темах порой выглядят как издевательство. Ну, что есть, то есть. Приходится искать в этом изливаемом на наши головы праведном гневе зерна знаний. Хочу поделиться своим видением проблемы, как виндусоид виндусоиду, хотя могу и ошибаться в чём-то.

Во-первых, виндовс и линукс разнятся гораздо сильнее чем может казаться на первый взгляд. Переход от одной ОС к другой может потребовать не перекомпиляции с косметическими правками, а гораздо более значительных изменений архитектуры приложения.

Внутренний компилятор. Ядро линукса собирается на определённой версии компилятора. Куча библиотек оказывается завязана именно на этот компилятор. Крайне желательно (обязательно), что бы ваше приложение и все используемые им библиотеки собиралось именно этим компилятором. Если компилятор не поддерживает нужного стандарта языка, то упс. Переписывайте код или ищите другое ядро. При смене версии ядра версия компилятора может меняться. Это не виндовс, где вы можете поставить визуальную студию любой версии и собирать на ней свою программу.

Библиотеки (настоятельно) принято размещать в общем пуле библиотек. Идеология винды с подкладывание библиотек к исполняемому файлу абсолютно не приветствуется. К этому общему пулу библиотек прилагается своя система версионности. К имени файла добавляется номер версии и там же создаются укороченные символьные линки (идентичное имя, но без части цифр в версии). Программа подгружает библиотеку по короткому имени, а система уже подменяет имя на нужную версию библиотеки.

Такая кухня потянула за собой необходимость грамотно копаться в этой огромной куче библиотек. Этим и занимаются пакетные менеджеры. Они подкачивают правильные версии библиотек (под ваш компилятор ядра), разворачивают их в общем пуле, создают символьные линки, удаляют и т.д. и т.п.

Может оказаться, что для вашего линукса нет нужного ffmpeg. Не под все линуксы он собирается и распространяется. В этом случае нельзя скачать с интернета готовое абы что и закинуть к своему приложению. ffmpeg внутри себя подключает другие библиотеки и если их не окажется или их версии окажутся не верными, то это все даже не скомпилируется. Ведь в линуксе не используется отдельный lib-файл, вместо него выступает сама библиотека. При отсутствии нужных зависимостей ругань начнётся при компиляции. В отсутствии готового пакета правильным будет выкачать исходники и скомпилировать их под своё ядро.

SO (шаред обжект) это не DLL (динамик линк лайбрари). Хоть и предназначены они примерно для одной цели, но есть и отличия. Для меня DLL всегда была черным ящиком. Я что-то напихал туда, вытащил наружу пару методов, скомпилировал статически и дальше не парюсь вопросами бинарной совместимости. В процессе разработки меняю DLL и не трогаю программу и связка продолжает работать пока я не поменяю API. В линуксе же, как я понимаю, такое не прокатит. Изменение библиотеки без затрагивания API может привести к потери бинарной совместимости ABI. По умолчанию из SO наружу торчит ВСЁ, а не только моё API. Кроме того внутренняя архитектура SO требует дополнительных действий с адресами переменных (PIC - Position-independent code). Это может казаться не заметным при кодинге, но лишь пока вы не захотите компилировать с проектом асемблерные куски. Очень вероятно, что то что прекрасно работало под виндой придётся малость переписать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.03.2022, 17:07
Помогаю со студенческими работами здесь

подключение библиотек через CMake
Подскажите пожалуйста как подключить библиотеку winmm.lib. Использую CLion, CMake v3.6.

C++ ffmpeg как правильно Настроить битрейт кодека AV_CODEC_ID_H264 пример < transcoding.c >
/* Я переработал пример transcoding.c вложил ему универсальности. Ресамплер и кольцевой буфер поставил перед фильтрами. То есть,...

Использование библиотек FFmpeg в QMdiSubWindow
На ГитХабе есть пример использования библиотек FFmpeg для просмотра камер видеонаблюдения по протоколу RTSP. ...

Статическая линковка библиотек через cmake
Всем привет. Столкнулся с такой проблемой, для gcc чтоыб он линковал статически с нужными либами передается такой ключ ...

Подключение библиотек с github в CMake проекты VS
День добрый! Я нашел интересную библиотеку на github-e(https://github.com/troldal/OpenXLSX), к ней прилагается инструкция по ее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru