#linux #dll #winapi
#linux #dll #winapi
Вопрос:
Я пытаюсь создать библиотеку DLL Win32 из библиотеки Linux, связанной с аудио-DSP (http://breakfastquay.com/rubberband /). Для Linux есть makefile и скрипты конфигурации, но нет справки для Windows. Автор предоставляет Win32-двоичный файл примера приложения, использующего библиотеку, и я вижу несколько «#ifdef MSVC» и «#ifdef WIN32», разбросанных повсюду, поэтому я не думаю, что начинаю полностью с нуля, но, тем не менее, я застрял.
Поскольку мои знания в области программирования на обеих платформах довольно ограничены, я был бы признателен за любую помощь.
Прежде всего, как правильно начать здесь? Visual Studio? Cygwin? Изначально я начал создавать проект библиотеки DLL Win32 в Visual Studio, добавляя исходные файлы, думая о добавлении файла .def и т.д., Но в какой-то момент я почувствовал, что это ни к чему не приведет.
Что касается Cygwin, я использовал ее впервые, и я даже не знаю, предназначена ли Cygwin для такого рода задач. Так ли это?
В Cygwin я запустил ./configure и застрял на чем-то вроде этого:
«проверка SRC … configure: ошибка: требования к пакету (samplerate) не были выполнены: пакет ‘samplerate’ не найден»
После просмотра журнала выясняется, что pkg-config ищет samplerate.pc. Как мне обрабатывать пакеты в Windows? libsamplerate — это просто библиотека с открытым исходным кодом, и у меня есть исходный код и DLL для этого. Но я не уверен, как использовать их для удовлетворения требований к зависимостям для librubberband (что я и пытаюсь создать)
На данный момент я совершенно запутался, и если кто-нибудь может подтолкнуть меня в правильном направлении … и есть ли более простой способ сделать это?
Заранее большое спасибо.
Комментарии:
1. Для samplerate вам, вероятно, потребуется собрать ее самостоятельно. Сборка и установка ее, как следует из приведенного ниже ответа, установит правильный файл samplerate.pc. Вероятно, вам потребуется сделать это для нескольких зависимостей.
Ответ №1:
Если вы все еще застряли на этом, я могу пролить немного света.
Возможно, вам придется создавать все из исходных текстов (или устанавливать библиотеки в вашей среде). Вы используете Cygwin, я бы также рекомендовал MinGW и MSYS, но иногда просто невозможно использовать эту комбинацию для сборки программы или библиотеки.
Поэтому, если вы используете Cygwin, сначала убедитесь, что у вас установлена соответствующая среда. Это означает, что у вас установлены правильные заголовки для разработки.
Затем загрузите libsndfile. Извлеките исходные тексты в каталог и из оболочки Cygwin bash перейдите в этот каталог. Там выполняют:
./configure
make
make install prefix=/cygdrive/c/cygwin
Обратите внимание, что я использую префикс, этот префикс должен указывать на каталог, в котором установлен Cygwin, чтобы правильно установить библиотеки (то же самое происходит с MinGW и MSYS, префикс должен указывать на каталог установки MinGW). Возможно, использование usr
каталога в префиксе тоже работает, я никогда этого не пробовал.
Теперь загрузите FFTW, так как он понадобится для libsamplerate и rubberband. Та же процедура, что и с libsndfile: извлеките, настройте, создайте и выполните установку с использованием префикса. Теперь скопируйте заголовочные файлы FFTW (в примере, в котором они будут находиться /cygdrive/c/cygwin/include
) в include
каталог в usr
каталоге (в примере /cygdrive/c/cygwin/usr/include
).
Следующий SRC (libsamplerate), та же процедура.
Затем Vamp plugin SDK. Для ее компиляции вам, возможно, потребуется отредактировать файл, srcvamp-hostsdkPluginLoader.cpp
удалив его RTLD_LOCAL
из dlopen()
вызова (это безопасно, это уже поведение по умолчанию).
Кроме того, вам может потребоваться установить ее вручную (по моему опыту, ей не понравился префикс). Или задайте переменную среды, PKG_CONFIG_PATH
указывающую на пути к pkgconfig, например:
set PKG_CONFIG_PATH=/cygdrive/c/cygwin/lib/pkgconfig:/usr/local/lib/pkgconfig
Теперь создайте вызываемый файл ladspa.h
в каталоге include с содержимым заголовка LADSPA
Наконец, настройте и соберите rubberband, он должен найти все, что ему нужно.
Для сборки в MSYS с использованием MinGW выполните ту же процедуру, используя соответствующий префикс. Другой альтернативой является использование Visual Studio, но вам может потребоваться использовать некоторые из готовых библиотек (например, для libsndfile), поскольку создание библиотек Linux изначально в Windows может быть сложным или даже невозможным (без взлома исходного кода) в VS.
В любом случае, автор rubberband предоставляет двоичные файлы; я думаю, вам следует рассмотреть возможность их использования вместо того, чтобы проходить через все это.
Комментарии:
1. Спасибо за этот подробный ответ. На самом деле, я все еще застрял. В конечном итоге я скомпилировал ее в VS, но привязка к ней не работает. Возможно, мне придется сделать еще один огромный крюк и заставить ее работать в MinGW или Cygwin… Я не мог использовать двоичные файлы, предоставленные автором, в первую очередь, поскольку это всего лишь пример приложения, использующего двоичный файл, а не двоичный файл для самой библиотеки (поправьте меня, если я ошибаюсь); в противном случае я был бы более чем счастлив отказаться от всех этих проблем. В любом случае, спасибо за ваш ответ. Мне придется попробовать.
2. Я не знаю, увидите ли вы в конечном итоге это, но я думаю, что у меня осталось всего одно препятствие, прежде чем я заставлю это работать. Я работаю на MinGW / MSYS и разобрался с linbsndfile, libsamplerate, fftw3 и vamp. Но librubberband, похоже, также требует библиотеки pthreads. Каково здесь решение? Установить pthreads-win32? Существуют ли какие-либо руководства для новичков по установке pthreads-win32, потому что у меня возникли проблемы с поиском. Похоже, вы делали это раньше, так что, возможно, у вас есть некоторое представление об этом. Еще раз спасибо!
3. Хм… Да, я делал это в среде Cygwin (где вы работали вначале), поэтому pthreads уже был доступен. Для MinGW у вас есть 2 варианта: либо скомпилировать pthreads-win32 самостоятельно (вы можете получить пакет здесь: sourceforge.net/projects/mingw/files посмотрите в файлах текущей версии GCC4) или используйте уже скомпилированную библиотеку. Вы также можете найти ее в том же месте, что и исходные тексты, или здесь sourceforge.net/projects/mingw-w64/files в разделе «внешние двоичные пакеты». Дайте мне знать что-нибудь еще 🙂
4. На самом деле я решил вообще не использовать pthreads (причина в том, что файл README указывает, что pthreads не нужны в Win32) и попытать счастья со взломом. Я думаю, что на самом деле это получилось неплохо. Просто нужно было добавить ‘#define _Win32’ в Thread. h и удалите -lpthread в LDFLAGS Makefile, и он будет скомпилирован / связан нормально. Она создала /bin/rubberband.exe который работает. Мне еще предстоит использовать . dll в моем приложении пока нет, но, эй, я похлопываю себя по спине за то, что зашел так далеко (незнание приводит к заниженным ожиданиям …)! Еще раз спасибо за вашу помощь в этом; я не думаю, что добрался бы сюда, погуглив.
5. Из любопытства, кто-нибудь, читающий это, уже создал рабочую Windows DLL библиотеки Rubber Band? А еще лучше, той, которая скомпилирована в MSVC? Если существует какой-либо проект с открытым исходным кодом с настроенными определениями проектов, я бы хотел избежать необходимости самому проходить через эту проблему 😉
Ответ №2:
Переход с Linux на w32 в основном является сложной задачей.
Для каждой из ваших зависимостей загрузите исходный код и:
./configure
make
sudo make install
Кроме того, я рекомендую вам использовать MinGW msys вместо CygWin (поскольку последний создает исполняемые файлы, которые зависят от его библиотек). Однако в вашей ситуации используйте подход VS — это сэкономит вам много времени.