我的PHP扩展依赖于extenal,我很难成功编译。我希望这个扩展是一个独立的共享对象,据我所知,这是phpize
的工作。如何使用目标文件c.o
编译此共享PHP扩展?
独立应用程序的手动编译如下所示:
gcc -Wall -o php_library main.c c.o
和共享库:
gcc -Wall -shared -fPIC -o php_library.so main.c c.o
我知道有些宏可以通过修改config.m4
来添加共享库依赖项,例如:PHP_ADD_LIBRARY(pthread,,EXTENSION_SHARED_LIBADD)
,但我不确定如何在编译时添加我的依赖项。对于这个用例,是否存在类似于上述的宏?
值得注意的是,我无法访问depdency代码,因此无法修改c.o
来解决此问题。
答案 0 :(得分:0)
根据我对您的问题的理解,您有一个目标文件c.o
,该文件未编译为具有与位置无关的代码(即-fPIC
选项),您希望将其链接到PHP扩展中。在这种情况下,您必须将其与扩展代码和任何共享库静态链接。在config.m4
文件中有几种方法可以执行此操作。
第一种是将CFLAGS
设置为将目标代码文件的名称传递给链接器,如下所示:
CFLAGS=-Wl,c.o
第二个是修改LDFLAGS
:
LDFLAGS=c.o
当我尝试第二个时,我在编译期间收到以下警告:
*** Warning: Linking the shared library testbed.la against the non-libtool
*** objects c.o is not portable!
一切都有效,所以我不确定警告是什么。但第一种方法并没有产生警告。
这是一个完整的样本config.m4
:
PHP_ARG_ENABLE(testbed, whether to enable testbed support,
[ --enable-testbed Enable testbed support])
if test "$PHP_TESTBED" = "yes"; then
AC_DEFINE(HAVE_TESTBED, 1, [Whether you have testbed support])
PHP_NEW_EXTENSION(testbed, testbed.c, $ext_shared)
#LDFLAGS=c.o
CFLAGS=-Wl,c.o
fi
我希望这能回答这个问题。