系统相关
首页 > 系统相关> > 奇怪的错误:在Windows上使用PHP7编译时出现无法解析的符号

奇怪的错误:在Windows上使用PHP7编译时出现无法解析的符号

作者:互联网

我有一个奇怪的问题:我有一个项目,其中使用了PHP7(php7ts.lib).

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 __imp__emalloc@@4 referenced in function
unresolved external symbol __imp__efree@@4
unresolved external symbol __imp__zval_dtor_func@@4
unresolved external symbol __imp__convert_to_string@@4
fatal error LNK1120: 4 unresolved externals

问题是:使用我自己编译的VS2013和PHP 5.6,一切正常.奇怪的是,未解析的符号指向的内容似乎不是特定于库的.

我正在从这里使用部门:http://windows.php.net/downloads/php-sdk/deps-7.0-vc14-x86.7z

我知道我丢失了一些东西,但是从这些消息中我看不到我丢失了什么.

编辑:一些新的-可能有用的-见解

好的,我现在可以获得更多信息,也许这可以帮助我们找到解决方案.

首先,我将以32位架构的Debug模式进行构建.

在cpp文件中,有以下几行(例如__imp__efree @@ 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
                  _efree@@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 _efree@@20 = @ILT+24528(_efree@@20)

我敢肯定,我正在对当前的lib进行操作,因为重命名该lib会给我一个错误,即该lib丢失了.

但是问题还没有解决

解决方法:

您需要将项目更新为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

静态库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

标签:shared-libraries,static-libraries,unresolved-external,php
来源: https://codeday.me/bug/20191027/1942811.html