Я использую mingw-w64 в Linux для перекрестной компиляции статической библиотеки ffmpeg для Windows с помощью следующей команды:
./configure --arch=x86 --disable-doc --disable-ffplay --disable-ffprobe --disable-ffmpeg --prefix=/mnt/c/ffmpeg --enable-gpl --enable-nonfree --target-os=mingw32 --cross-prefix=i686-w64-mingw32- --pkg-config=pkg-config --disable-shared --enable-static
make -j16
make install
Затем у меня появилось несколько файлов .a
вместо файлов .lib
. Могу ли я напрямую связать эти файлы с MSVC? Если нет, что мне делать дальше?
@HolyBlackCat Я хочу скомпилировать библиотеку ffmpeg для Windows на wsl, пытаюсь использовать --toolchain=msvc
, но это не работает. Может быть, мне стоит скомпилировать его в динамическую библиотеку?
Почему вы используете wsl вместо компиляции непосредственно в Windows?
Я бы рекомендовал установить его через vcpkg, если вы предпочитаете компилятор MSVC.
@HolyBlackCat Как запустить настройку в Windows? Использование msys2 должно дать тот же результат. Vcpkg — хороший выбор, но в целях обучения я просто хочу скомпилировать его самостоятельно, следуя инструкциям. Создание файлов .a
вместо файлов .lib
меня расстроило, и я не знаю, что делать дальше.
«Как запустить настройку в Windows?» MSYS2 включает bash
, который может его запустить. У FFmpeg есть руководство по компиляции для MSVC, но оно использует MSYS1, а не MSYS2. Однако адаптация его к MSYS2 должна быть простой: запустите командную строку VS Developer, из нее запустите оболочку MSYS (c:\msys64\msys2_shell.cmd -full-path
), затем ./configure --toolchain=msvc && make
. Я попробую сам через минуту.
@HolyBlackCat Я использую wsl уже давно, поэтому сначала не хотел устанавливать msys. Мне удалось найти только руководства по кросс-компиляции динамических библиотек в браузере вместо статических библиотек, поэтому я попытался следовать руководству ffmpeg CrossCompilingForWindows для компиляции статических библиотек, но не получил .lib
файлов. Я знаю, что динамические библиотеки могут быть связаны с MSVC, а статические библиотеки - нет, но я дал проблеск надежды, что, возможно, статические библиотеки кросс-компиляции немного отличаются.
Я скомпилировал рабочую динамическую библиотеку на wsl, просто хочу узнать, есть ли способ скомпилировать на ней рабочую статическую библиотеку
Возможно, просто переименование .lib
в .a
сработает? Google говорит, что оба являются архивами AR.
Но сама идея (компиляция с помощью MinGW, а затем использование библиотеки с MSVC) кажется отрывочной даже для разделяемых библиотек. Хотя чистые библиотеки C должны быть совместимы между компиляторами, MinGW, скорее всего, будет использовать другую среду выполнения C (хотя существуют версии, которые используют ту же среду выполнения C, что и современный MSVC). В этом посте написано, что если ты осторожен, то это нормально, но я бы не хотел.
Если вы настаиваете на кросс-компиляции из Linux и настаиваете на использовании MSVC в Windows, а не MSVC, лучший вариант, по моему мнению, — использовать clang-cl
в Linux для создания MSVC-совместимых библиотек (укажите его на установку MSVC с github.com/ mstorsjo/msvc-wine)
@HolyBlackCat Переименование .a
в .lib
не работает. И вы правы, в моем случае использование динамической библиотеки требует другой среды выполнения C.
Несмотря на то, что вы просили о кросс-компиляции, вот как это можно сделать в Windows. Я бы предпочел сделать это, чем пытаться использовать библиотеки MinGW с MSVC.
Это адаптировано для MSYS2 из официального руководства, использующего MSYS1.
pacman -Syu
. Если он закрывается во время обновления, перезапустите и запустите pacman -Syu
, чтобы завершить обновление../configure
: pacman -S make diffutils mingw-w64-ucrt-x86_64-yasm
.C:\msys64\msys2_shell.cmd -ucrt64 -full-path
. Это добавит cl.exe
к PATH.cd
в исходный каталог FFmpeg, ./configure --toolchain=msvc
, make -j4
, DESTDIR = "$(realpath inst)" make install
для установки в ./inst
.Я успешно создал динамическую библиотеку в wsl, используя --toolchain=msvc
. Измените configure
, чтобы использовать команду wslpath
, чтобы CC_DEPCMD
использовал путь wsl вместо пути Windows. Затем, самое главное, выполните команду wsl в cmd вместо оболочки. В остальном это выглядит так же, как использование компиляции cl.exe
в MSYS.
Я бы настоятельно советовал не смешивать разные инструменты сборки.
Зачем вам кросс-компиляция ffmpeg, чтобы затем связать его с MSVC?
Гораздо лучше было бы придерживаться одной среды сборки (в вашем случае MSVC) для сборки всего.
Можно собрать ffmpeg с MSVC согласно: https://trac.ffmpeg.org/wiki/CompilationGuide/MSVC
В общем, нельзя. Иногда обратное (компиляция в MSVC с использованием MinGW) работает для некоторых библиотек C, так что, возможно, то, что вы говорите, тоже может работать. Но почему бы вам просто не использовать один компилятор? Либо используйте MinGW и в Windows, либо используйте MSVC в Linux (это может оказаться сложным).