3

У меня есть странная проблема: у меня есть проект, в котором используется 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.

Но проблема не решена до сих пор

ответ

2

Вам необходимо обновить ваш проект для проекта VS2015. Все неразрешенные функции имеет ZEND_FASTCALL соглашение о вызове (zend_portability.h):

#if defined(__GNUC__) && ZEND_GCC_VERSION >= 3004 && defined(__i386__) 
# define ZEND_FASTCALL __attribute__((fastcall)) 
#elif defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER == 1700 
# define ZEND_FASTCALL __fastcall 
#elif defined(_MSC_VER) && _MSC_VER >= 1800 && !defined(__clang__) 
# define ZEND_FASTCALL __vectorcall 
#else 
# define ZEND_FASTCALL 
#endif 

Static php7ts.lib библиотека была построена с использованием VS2015 и __vectorcall соглашение о вызовах (https://msdn.microsoft.com/en-us/library/dn375768.aspx):

Function names are suffixed with two "at" signs (@@) followed by the number of bytes (in decimal) in the parameter list

1

У меня была аналогичная проблема в Ошибка создания сообщества Visual Studio 2017:

error LNK2019: unresolved external symbol [email protected]@40 referenced in function "struct _zend_string * __cdecl zend_string_alloc(unsigned __int64,int)" ([email protected]@[email protected]@[email protected]) 

Решение, которое сработало для меня, было установить Zend_Debug до 0

#define ZTS 1 
//#define PHP_COMPILER_ID "VC14" 
#define ZEND_WIN32 1 
#define PHP_WIN32 1 
#define ZEND_DEBUG 0 

/* 
#ifdef _DEBUG 
#define ZEND_DEBUG 1 
#else 
#define ZEND_DEBUG 0 
#endif 
*/ 

Также убедитесь, что вы установили генерацию кода для многопоточных Debug (/ МПД) на свойствах проекта.

enter image description here

Смежные вопросы