Как вы компилируете статическую библиотеку pthread-win32 для x64?
Похоже, что некоторая работа была проделана, чтобы заставить pthread-win32 работать с x64, но нет никаких инструкций по сборке. Я попытался создать симуляцию с помощью командной строки Visual Studio x64 Cross Tools, но когда я пытаюсь связать библиотеку с приложением x64, он не видит ни одного экспорта функции. Кажется, что он все еще компилирует lib как x86 или что-то в этом роде.
Я даже пытался добавить /MACHINE в make-файл в соответствующих местах, но это не помогает. Кто-нибудь получил это на работу?
5 ответов
Пока он официально не выпущен, похоже, что вам нужно проверить заголовок CVS, чтобы получить версию 2.9 библиотеки. В версии 2.9 есть все исправления для x64, но у вас все равно будут проблемы, если вы попытаетесь скомпилировать статическую библиотеку из командной строки.
Единственный обходной путь, о котором я знаю, - это использование DLL вместо статического связывания LIB.
Вы можете использовать vcpkg здесь. Это менеджер пакетов Windows для C++. Он поддерживает построение потоков, а также другие библиотеки с открытым исходным кодом.
Я хотел использовать статическую библиотеку pthread. Когда я загрузил pthread, я получил dll(pthread.dll) и импортировал lib(pthread.lib), т.е. я не могу использовать только pthread.lib. Мне пришлось использовать файл pthread.dll.
Итак, используя vcpkg, я создал статическую библиотеку. Что я могу использовать без каких-либо зависимостей dll
Используя "vcpkg", вы можете создавать как статические, так и динамические библиотеки.
Вы можете использовать следующие шаги
Ниже я добавил шаги для всех случаев DLL (x86|x64) и LIB (x86|x64). Вы можете построить его по своему усмотрению.
Клонировать vcpkg из каталога git vcpkg git repo
Из каталога, в котором вы клонировали vcpkg, выполните команду ниже, которая установит vcpkg
bootstrap - vcpkg.bat
Проверьте доступность библиотеки, выполнив следующие команды
vcpkg search pthread
Что покажет вам результат ниже
mbedtls[pthreads] Multi-threading support
pthread 3.0.0 empty package, linking to other port
pthreads 3.0.0-6 pthreads for windows
Как видите, он поддерживает pthread для Windows.
1 .Создание динамической библиотеки с использованием библиотеки импорта (DLL)
Сборка x86 DLL
vcpkg install pthreads:x86-windows
Который будет строить DLL и библиотеку импорта в .\ Vcpkg\ установлена \x86-окно от сюда скопировать LIB и включает в себя, и вы можете использовать их
Сборка x64 DLL
vcpkg install pthreads:x64-windows
Который будет строить DLL и библиотеку импорта в .\ Vcpkg\ установлена \x64-окна отсюда скопировать LIB и включают в себя папку.
2. Создание статической библиотеки (LIB)
Сборка x86 LIB
vcpkg install pthreds:x86-windows-static
Который будет строить DLL и библиотеку импорта в .\ Vcpkg\ установившего \x86-Windows-статический здесь скопировать LIB и включает в себя, и вы можете использовать их
Сборка x64 LIB
vcpkg install pthreds:x64-windows-static
Который будет строить DLL и библиотеку импорта в .\ Vcpkg\ установившего \x64-Windows-статический здесь скопировать LIB и включает в себя папку.
ПРИМЕЧАНИЕ: попробуйте использовать с правами администратора
Для меня я просто использую 64-битный Windows-компилятор (кросс-компилятор mingw-w64 в данном конкретном случае), а затем делаю (с 2.9.1) следующим образом:
$ make clean GC-static
Тогда как я устанавливаю его для использования (иногда это может не понадобиться, конечно),
cp libpthreadGC2.a $mingw_w64_x86_64_prefix/lib/libpthread.a
cp pthread.h sched.h semaphore.h $mingw_w64_x86_64_prefix/include
затем, чтобы использовать его, вы должны определить это (пример строки конфигурации ffmpeg для его использования):
--extra-cflags=-DPTW32_STATIC_LIB
Во всяком случае, это один из способов.
Другой способ - сделать то же самое, затем изменить файлы *.h и удалить все ссылки на dllexport из заголовков (или вручную определить DPTW32_STATIC_LIB в заголовках).
например:
sed 's/ __declspec (dllexport)//g;s/ __declspec (dllimport)//g'
(ссылка: сценарии сборки zeranoe)
Вот как я это сделал (VS2015). Должно работать и для старых Visual Studio.
1) Загрузите релиз.zip с SourceForge
2) Распаковать в чистую папку - должен увидеть "pthreads.2"
3) Откройте командную строку Visual Studio, перейдите к "pthreads.2". 4) Запустите "nmake", без аргументов. Он выдает справочное сообщение со списком всех допустимых команд, которые вы можете дать 'nmake' для его создания. Для получения дополнительной информации см. Файл "pthreads.2\FAQ", который объясняет их 3 различных варианта обработки "очистки".
Я бы предложил строить только "VC" и "VC-debug" (и, возможно, статические из них). "Настоящие" pthreads - это системная библиотека C на платформах POSIX, таких как Linux, поэтому только те комбинации могут дать вам точно такое же поведение C-ошибок в Windows, как и в Linux, FreeBSD и т. Д.
Чтобы расширить ответ kgriffs, нужно сделать еще две вещи для создания 64-битной DLL, а не 32-битной DLL.
Сначала загрузите последние pthreads через CVS (как предложено здесь)
1) использовать 64-битные инструменты сборки - достигается путем загрузки правильных настроек среды VC в командной строке (подробнее об этом здесь):
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat amd64
(измените 11.0 на любую версию, которую вы используете)
2) Как написано в make-файле pthreads:
TARGET_CPU - это переменная среды, устанавливаемая в командной строке Visual Studio в соответствии с SDK (VS 2010 Express плюс SDK 7.1). PLATFORM - это переменная среды, которая может быть установлена в кросс-среде разработки VS 2013 Express x64.
Это означает, что если это не было сделано с помощью vcvars (в моем случае это не так), вам нужно установить TARGET_CPU или PLATFORM (на всякий случай, я установил их оба):
set TARGET_CPU=x64
set PLATFORM=x64
3) и теперь последний шаг:
nmake clean VC
nmake clean VC-debug
это создаст 64-битные файлы DLL (и правильную библиотеку импорта и PDB). Я могу убедиться, что он работает с Visual Studio 2012.
Мне удалось заменить "pthread-win32" на "pthreads4w" https://sourceforge.net/projects/pthreads4w/ и скомпилировать в MSVC2019 для цели x64 с помощью консолиnmake
команда. Даже статическая ссылка.