Tôi đang cố biên dịch phần mở rộng imagemagick (imagick) để sử dụng trong môi trường không an toàn trên cửa sổ.Biên dịch một phần mở rộng của PHP là không an toàn theo chủ đề
Tôi đang sử dụng PHP 5.3.10 và đã thiết lập Visual C++ express làm môi trường biên dịch của tôi. Vấn đề là tôi đang sử dụng một phiên bản PHP không an toàn với tư cách là một mô-đun FCGI trong Apache 2.2.
Do đó, PHP của tôi được cung cấp với php5.lib
và không phải là php5ts.lib
. Tôi tin rằng đây là lý do tại sao tôi nhận được các lỗi này:
imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick
Tôi chỉ xây dựng và biên dịch mọi thứ trên linux, vì vậy không chắc chắn cách thực hiện điều này trên môi trường cửa sổ.
Tôi làm cách nào để biên dịch tiện ích để tiện ích không an toàn?
Tôi đã tải xuống bản nhị phân luồng của PHP 5.3.10 để nhận bản sao của php5ts.lib. Sau đó tôi có thể biên dịch phần mở rộng.
Tôi đoán rằng việc đặt chỉ thị tiền xử lý ZTS
thành 1
hoặc 0
sẽ làm cho tiện ích mở rộng biên dịch thành luồng an toàn hoặc không an toàn. (Không quá chắc chắn về điều này, vì vậy nếu ai đó có thể cho tôi biết nếu điều này là chính xác hay không, nó sẽ được nhiều đánh giá cao. :))
Sau đó tôi thiết lập một máy ảo chạy Windows 7 và cài đặt phiên bản mới nhất của WAMP. Lý do là nó đã sử dụng một phiên bản an toàn của PHP.
Tôi đã đặt dll trong thư mục ext trong cài đặt PHP và bật nó trong php.ini
. Tuy nhiên, ngay sau khi thử cả hai phiên bản ts và nts trong WAMP, tôi sẽ nhận được:
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
Nhưng vấn đề là rằng c:/wamp/bin/php/php5.3.10/ext/imagick.dll'
không tồn tại, và có tôi đã kiểm tra này rất nhiều lần.
Sau đó tôi hạ cấp ImageMagick xuống 6.6.2-10-Q16 nhưng vẫn thấy cùng một vấn đề.
Sự cố tương tự xảy ra trên máy dev của tôi đang chạy phiên bản nts của PHP 5.3.10 trên Apache 2.2 (tất cả được cài đặt theo cách thủ công).
Có vẻ như tôi có thể sai về bộ xử lý trước ZTS
. Nếu tôi đặt ZTS=0
và biên dịch, hãy sử dụng bộ phụ thuộc tập đi trên dll được biên dịch vẫn cho thấy rằng nó yêu cầu php5ts.dll
chỉ xuất hiện trên các phiên bản an toàn của PHP.
Tôi đã làm việc nhiều hơn với người phụ thuộc tập đi và thấy rằng tôi phải liên kết thống kê với msvc100d.dll. Sau đó tôi đã xóa ZTS
trong định nghĩa tiền xử lý và có thể biên dịch bằng cách sử dụng php5.lib
thay vì php5ts.dll
. Tôi nghĩ rằng điều này sẽ cho tôi một dll phi ts.
Tuy nhiên, khi tải các phần mở rộng, tôi vẫn nhận được:
PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0
Và lỗi từ sự phụ thuộc walker:
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.
cài đặt Visual C++ hiện năm 2008 và biên soạn sử dụng nền tảng bộ công cụ V90 , nhưng vẫn phải đối mặt với cùng một vấn đề.
Bất cứ lời khuyên đánh giá cao :)
câu hỏi serverfault.com. – Raptor