У меня есть странная проблема: у меня есть проект, в котором используется PHP7 (php7ts.lib
).Странная ошибка: неразрешенный символ при компиляции с PHP7 в Windows
PHP7 составлен на мое с VS 2015:
--enable-mbstring=static --with-gd=static --with-iconv=static
--enable-soap --enable-sockets --disable-ipv6 --with-dom
--disable-bcmath --disable-cgi --disable-cli --enable-embed
--with-bz2=static --enable-com-dotnet --enable-ctype
--enable-mbregex=static --disable-mbregex-backtrack --enable-odbc --with-mp
То же самое с более уменьшенным числом параметров:
--disable-all --without-libxml --without-dom --enable-sockets
--enable-embed --enable-com-dotnet --enable-ctype --enable-odbc
--enable-debug
BZip2 также составлен самостоятельно и это работает. Работает сборник PHP7, я получаю файлы .lib
и .dll
. Тогда я компиляции проекта, и я получаю это странные ошибки:
error LNK2019: unresolved external symbol [email protected]@4 referenced in function
unresolved external symbol [email protected]@4
unresolved external symbol [email protected]@4
unresolved external symbol [email protected]@4
fatal error LNK1120: 4 unresolved externals
Проблема заключается в том: С VS2013 и PHP 5.6, составленный самостоятельно, все работало. Странно, что неразрешенные символы указывают на то, что не выглядит специфичным для библиотеки.
Я использую DEPS здесь: http://windows.php.net/downloads/php-sdk/deps-7.0-vc14-x86.7z
Я знаю, что я что-то отсутствует, но из этих сообщений я не могу видеть, что я пропускаю.
Edit: Некоторое новое - может быть полезно - понимание
ОК, теперь я мог получить больше информации, может быть, это поможет нам найти решение.
Во-первых, я создаю это в режиме отладки с 32-битной архитектурой.
В cpp
файле, есть такие строки (в качестве примера для [email protected]@4
ошибки:
#if PHP_VERSION_ID >= 70000
# define FREE_ZVAL(z) efree_rel(z)
#endif
Когда я иду к определению efree_rel(z)
, я вижу эту линию (которая имеет что-то делать с Zend
):
#define efree_rel(ptr) _efree((ptr) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
Переходя к определению _efree
, я вижу это:
ZEND_API void ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
Значит, эта функция исходит из PHP7/Zend. Эта строка находилась в файле zend_alloc.h
. Итак, насколько я знаю, я должен посмотреть, если этот файл экспортируется в файл lib
или dll
. Так демпинг из экспорта дает мне (для lib
):
Dump of file php7ts_debug.lib
File Type: LIBRARY
Exports
ordinal name
[email protected]@20
И dll
:
Dump of file php7ts_debug.dll
File Type: DLL
Section contains the following exports for php7ts_debug.dll
00000000 characteristics
56EAF08F time date stamp Thu Mar 17 18:59:43 2016
0.00 version
1 ordinal base
1531 number of functions
1531 number of names
ordinal hint RVA name
192 18 0028FFE0 [email protected]@20 = @ILT+24528([email protected]@20)
Я уверен, что я действую на corrent lib
, потому что переименование LIB дает мне ошибку , что отсутствует lib
.
Но проблема не решена до сих пор