Можно ли связать статическую библиотеку MinGW с MSVC?

Я использую 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? Если нет, что мне делать дальше?

В общем, нельзя. Иногда обратное (компиляция в MSVC с использованием MinGW) работает для некоторых библиотек C, так что, возможно, то, что вы говорите, тоже может работать. Но почему бы вам просто не использовать один компилятор? Либо используйте MinGW и в Windows, либо используйте MSVC в Linux (это может оказаться сложным).

HolyBlackCat 24.06.2024 09:20

@HolyBlackCat Я хочу скомпилировать библиотеку ffmpeg для Windows на wsl, пытаюсь использовать --toolchain=msvc, но это не работает. Может быть, мне стоит скомпилировать его в динамическую библиотеку?

ValueError 24.06.2024 09:43

Почему вы используете wsl вместо компиляции непосредственно в Windows?

HolyBlackCat 24.06.2024 09:43

Я бы рекомендовал установить его через vcpkg, если вы предпочитаете компилятор MSVC.

HolyBlackCat 24.06.2024 09:45

@HolyBlackCat Как запустить настройку в Windows? Использование msys2 должно дать тот же результат. Vcpkg — хороший выбор, но в целях обучения я просто хочу скомпилировать его самостоятельно, следуя инструкциям. Создание файлов .a вместо файлов .lib меня расстроило, и я не знаю, что делать дальше.

ValueError 24.06.2024 10:18

«Как запустить настройку в Windows?» MSYS2 включает bash, который может его запустить. У FFmpeg есть руководство по компиляции для MSVC, но оно использует MSYS1, а не MSYS2. Однако адаптация его к MSYS2 должна быть простой: запустите командную строку VS Developer, из нее запустите оболочку MSYS (c:\msys64\msys2_shell.cmd -full-path), затем ./configure --toolchain=msvc && make. Я попробую сам через минуту.

HolyBlackCat 24.06.2024 10:24

@HolyBlackCat Я использую wsl уже давно, поэтому сначала не хотел устанавливать msys. Мне удалось найти только руководства по кросс-компиляции динамических библиотек в браузере вместо статических библиотек, поэтому я попытался следовать руководству ffmpeg CrossCompilingForWindows для компиляции статических библиотек, но не получил .lib файлов. Я знаю, что динамические библиотеки могут быть связаны с MSVC, а статические библиотеки - нет, но я дал проблеск надежды, что, возможно, статические библиотеки кросс-компиляции немного отличаются.

ValueError 24.06.2024 10:37

Я скомпилировал рабочую динамическую библиотеку на wsl, просто хочу узнать, есть ли способ скомпилировать на ней рабочую статическую библиотеку

ValueError 24.06.2024 10:44

Возможно, просто переименование .lib в .a сработает? Google говорит, что оба являются архивами AR.

HolyBlackCat 24.06.2024 10:50

Но сама идея (компиляция с помощью MinGW, а затем использование библиотеки с MSVC) кажется отрывочной даже для разделяемых библиотек. Хотя чистые библиотеки C должны быть совместимы между компиляторами, MinGW, скорее всего, будет использовать другую среду выполнения C (хотя существуют версии, которые используют ту же среду выполнения C, что и современный MSVC). В этом посте написано, что если ты осторожен, то это нормально, но я бы не хотел.

HolyBlackCat 24.06.2024 11:06

Если вы настаиваете на кросс-компиляции из Linux и настаиваете на использовании MSVC в Windows, а не MSVC, лучший вариант, по моему мнению, — использовать clang-cl в Linux для создания MSVC-совместимых библиотек (укажите его на установку MSVC с github.com/ mstorsjo/msvc-wine)

HolyBlackCat 24.06.2024 11:06

@HolyBlackCat Переименование .a в .lib не работает. И вы правы, в моем случае использование динамической библиотеки требует другой среды выполнения C.

ValueError 24.06.2024 11:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Несмотря на то, что вы просили о кросс-компиляции, вот как это можно сделать в Windows. Я бы предпочел сделать это, чем пытаться использовать библиотеки MinGW с MSVC.

Это адаптировано для MSYS2 из официального руководства, использующего MSYS1.

  • Установите MSYS2 с https://www.msys2.org/
  • Обновите его, используя pacman -Syu. Если он закрывается во время обновления, перезапустите и запустите pacman -Syu, чтобы завершить обновление.
  • Установите то, что запрашивает скрипт ./configure: pacman -S make diffutils mingw-w64-ucrt-x86_64-yasm.
  • Закройте MSYS2, откройте командную строку разработчика VS, запустите MSYS2 внутри нее, используя 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.

ValueError 24.06.2024 23:35

Я бы настоятельно советовал не смешивать разные инструменты сборки.

Зачем вам кросс-компиляция ffmpeg, чтобы затем связать его с MSVC?

Гораздо лучше было бы придерживаться одной среды сборки (в вашем случае MSVC) для сборки всего.

Можно собрать ffmpeg с MSVC согласно: https://trac.ffmpeg.org/wiki/CompilationGuide/MSVC

Другие вопросы по теме