Компиляция расширения PHP как не поточно-ориентированного

Я пытаюсь скомпилировать расширение imagemagick (imagick) для использования в среде, не поддерживающей потоки в Windows.

Я использую PHP 5.3.10 и настроил Visual C ++ express в качестве среды компиляции. Проблема в том, что я использую не-поточно-ориентированную версию PHP в качестве модуля FCGI в Apache 2.2.

Таким образом, мой PHP поставляется сphp5.lib и неphp5ts.lib, Я считаю, что это причина, почему я получаю эти ошибки:

<code>imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick
</code>

Я только когда-либо собирал и компилировал вещи на Linux, так что я не слишком уверен, как это сделать в среде Windows.

Как я могу скомпилировать расширение, чтобы оно не было поточно-ориентированным?

Я загрузил потокобезопасный двоичный файл PHP 5.3.10, чтобы получить копию php5ts.lib. Затем я смог скомпилировать расширение.

Я предполагаю, что установкаZTS директива препроцессора либо1 или же0 приведет к тому, что расширение будет скомпилировано как поточно-безопасное или не поточно-безопасное. (Не слишком уверен в этом, поэтому, если кто-то может сообщить мне, если это правильно или нет, это будет высоко ценится. :))

Затем я настроил виртуальную машину под управлением Windows 7 и установил последнюю версию WAMP. Причина в том, что он использовал многопоточную версию PHP.

Я поместил DLL в папку ext в установке PHP и включил его вphp.ini, Однако даже после того, как я попробовал обе версии ts и nts в WAMP, я получил бы:

<code>PHP Warning:  PHP Startup: Unable to load dynamic library 'c:/wamp/bin/php/php5.3.10/ext/imagick.dll' - The specified module could not be found.
 in Unknown on line 0
</code>

Но дело в том, чтоc:/wamp/bin/php/php5.3.10/ext/imagick.dll' существует, и да, я проверял это много раз.

Затем я понизил ImageMagick до 6.6.2-10-Q16, но все еще вижу ту же проблему.

Та же проблема возникает на моем компьютере разработчика, использующем версию PHP 5.3.10 nts на Apache 2.2 (все устанавливаются вручную).

Похоже, я могу ошибаться в отношенииZTS препроцессор. Если я установлюZTS=0 и скомпилировать, используя обходчик зависимостей на скомпилированном dll, все еще показывает, что это требуетphp5ts.dll который присутствует только в многопоточных версиях PHP.

Я проделал большую работу с обходчиком зависимостей и обнаружил, что мне нужно было статистически ссылаться на msvc100d.dll. Я тогда удалилZTS в определении препроцессора и был в состоянии скомпилировать с помощьюphp5.lib вместоphp5ts.dll, Я думаю, что это должно заставить меня не-дц.

Однако при загрузке расширения я по-прежнему получаю:

<code>PHP Warning:  PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0
</code>

И ошибки от ходунков зависимостей:

<code>Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
</code>

Установлен Visual C ++ Express 2008 и скомпилирован с использованием инструментария платформы v90, но все еще сталкивается с теми же проблемами.

Любые советы приветствуются :)

Solution Found! See my answer.
 Raptor10 апр. 2012 г., 18:26
вопрос serverfault.com

Ответы на вопрос(2)

по которой вам нужно компилировать? Почему бы не скачать? Это обычно намного проще / быстрее в Windows.

VC6:http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/

VC9:http://valokuva.org/builds/

 F2111 апр. 2012 г., 01:10
Я имел в виду 3.1.0rc1, а не 3.1.0b1.
 F2111 апр. 2012 г., 00:54
Я пробовал сборки с Valokuva.org, но они не работали на моем вручную установленном сервере или WAMP. Двоичные файлы от sk89q.com также не работали. Вот почему я хочу скомпилировать 3.1.0b1 для последней версии imagemagick.
Решение Вопроса

что это может помочь тем, кто собирает расширения php для Windows в будущем. То, что я сделал, основано на:https://wiki.php.net/internals/windows/stepbystepbuild

Примечание. На этом сайте я прочитал ответ, в котором говорится, что компиляция расширений PHP в Windows не поддерживается. Судя по моим вчерашним экспериментам, кажется, что и здесь много работы, поэтому я использую процесс сборки PHP.

Лучший способ - использовать процесс сборки PHP.

Install Visual C++ Express 2008 (any version will do, but express is free) and Windows SDK 6.1 (note that we want the 6.1 version not anything older or newer).

Install the SVN client tools if you haven't done so and restart for your PATH variable to take effect.

Get the PHP SDK binary tools and extract it to C:\php-sdk.

Start the CMD Shell under Microsoft Windows SDK v6.1 in your start menu and run cd C:\php-sdk.

Run setenv /x86 /xp /release this creates a 32-bit release. You can use /x64 to build a 64-bit release (I have not tried this).

run bin\phpsdk_setvars.bat

run bin\phpsdk_buildtree.bat php53dev

Download the PHP source code and extract it to C:\php-sdk\php53dev\vc9\x86 so that you end up with C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

Download the latest deps and extract everything to C:\php-sdk\php53dev\vc9\x86. You may be prompted to overwrite any existing folders, so press yes.

run cd C:\php-sdk\php53dev\vc9\x86

Check out the latest version of your extension from the svn repository: svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick I am checking out imagick here.

Install any dependencies. In my case, I need to install ImageMagick, so I downloaded the latest recommended windows binary. You will need to restart after installation to update your PATH variable, but you can do this after you have compiled. Make sure you install the C/C++ headers and includes as well.

Copy the contents of the includes directory from the ImageMagick install directory to C:\php-sdk\php53dev\vc9\x86\deps\include.

Copy the contents of the lib directory from the ImageMagick install directory to C:\php-sdk\php53dev\vc9\x86\deps\lib

Now, let's build: run cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz then buildconf then configure --help. Look at the help properly. It will show you all config flags and any avaliable extensions to enabled. In my case, since I added imagick, I had an option called --with-imagick

Run config: configure --enable-cli --with-imagick=shared --disable-zts If you want to build a non-thread-safe binary use --disable-zts, otherwise remove that configuration flag. I am not sure why, but sometimes extensions use the --with-myextension flag and sometimes --enable-myextension, so check configure --help for the flag to use. If you add =shared after the extension flag, it will be compiled as a separate DLL, which si what we want.

Compile: run nmake then nmake snap.

Done :) Check C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release (non-thread-safe) or C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS (thread-safe). Your compiled binaries should be in there. The compiled extensions (pecl), should be in a ZIP file similiar to pecl-5.3.10-nts-Win32-VC9-x86.zip. Open this file and extract the extensio DLL to your ext folder in your PHP installation.

Enable the PHP extension and restart your webserver. Run phpinfo() and check that the extension is enabled.

If the extension does not work properly, make sure you reboot to update your PATH variable. In my case, I need to have the imagemagick install directory in my PATH variable.

???

Profit!

 10 июл. 2017 г., 06:05
Я хочу поблагодарить вас за то, что вы нашли время написать эту прекрасную инструкцию. Действительно полезно!

Ваш ответ на вопрос