phpize 的 config.m4 在 PHP_NEW_EXTENSION 中包含多个源文件,会生成一个不执行任何操作的 Makefile

mar*_*hon 4 php c autoconf makefile php-extension

我正在尝试编写 PHP 的 C 扩展。这是我的config.m4。几乎直接从 helloworld 中出来

PHP_ARG_ENABLE(my_ext, whether to enable my_ext support,
[ --enable-my-ext   Enable My Ext support])

if test "$PHP_MY_EXT" = "yes"; then
  AC_DEFINE(HAVE_MY_EXT, 1, [Whether you have my ext])
  PHP_NEW_EXTENSION(my_ext, my_ext.c,  $ext_shared)
fi
Run Code Online (Sandbox Code Playgroud)

当我运行 phpize 和 ./configure 时,它​​会生成一个可以工作的 Makefile。 到目前为止看起来不错。

现在,如果我向 PHP_NEW_EXTENSION 添加额外的源文件,事情就会崩溃。根据此处此处,调用应如下所示:

PHP_NEW_EXTENSION(foo, foo.c bar.c baz.cpp, $ext_shared)
Run Code Online (Sandbox Code Playgroud)

完整语法:

PHP_NEW_EXTENSION(extname, sources [, shared [,sapi_class[, extra-cflags]]])
Run Code Online (Sandbox Code Playgroud)

好的,所以我将额外的源文件 (logging.c) 添加到该列表中:

PHP_NEW_EXTENSION(my_ext, my_ext.c, logging.c  $ext_shared)
Run Code Online (Sandbox Code Playgroud)

和 phpize/configure生成一个成功运行的 Makefile,但实际上并没有构建任何东西。 (是的,我已经做了 make distclean、phpize --clean 等)

我比较了成功的 Makefile 和损坏的 Makefile,以下是差异:

$ diff Makefile Makefile.broken 
14d13
< shared_objects_my_ext = my_ext.lo
16c15
< PHP_MODULES = $(phplibdir)/my_ext.la
---
> PHP_MODULES =
170,175d168
< $(phplibdir)/my_ext.la: ./my_ext.la
<   $(LIBTOOL) --mode=install cp ./my_ext.la $(phplibdir)
< 
< ./my_ext.la: $(shared_objects_my_ext) $(MY_EXT_SHARED_DEPENDENCIES)
<   $(LIBTOOL) --mode=link $(CC) $(COMMON_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) -o $@ -export-dynamic -avoid-version -prefer-pic -module -rpath $(phplibdir) $(EXTRA_LDFLAGS) $(shared_objects_my_ext) $(MY_EXT_SHARED_LIBADD)
< 
Run Code Online (Sandbox Code Playgroud)

有人知道这是怎么回事吗?

顺便说一句,如果我省略了额外的源文件,我会收到有关该文件中具有“内部链接但未定义”的函数的编译器警告。

Fuz*_*ree 5

尝试移动第二个逗号

PHP_NEW_EXTENSION(my_ext, my_ext.c, logging.c $ext_shared)

PHP_NEW_EXTENSION(my_ext, my_ext.c logging.c, $ext_shared)

如果我正确理解文档,第二个参数应该是空格分隔的源列表。