【问题标题】:PHP extension library dependencyPHP扩展库依赖
【发布时间】:2017-07-01 15:43:36
【问题描述】:

我的 PHP 扩展有一个外部依赖项,我正在努力编译成功。我希望这个扩展成为一个独立的共享对象,据我所知,这是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),但我不确定如何在编译时添加我的依赖项。这个用例有类似上面的宏吗?

值得注意的是,我无法访问依赖代码,因此无法修改c.o来解决此问题。

【问题讨论】:

    标签: php c php-extension


    【解决方案1】:

    根据我从您的问题中了解到的情况,您有一个目标文件 c.o,它没有被编译为具有您想要链接到您的 PHP 扩展的与位置无关的代码(即 -fPIC 选项)。在这种情况下,您必须将它与扩展代码和任何共享库一起静态链接。在 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
    

    我希望这能回答这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2019-12-05
      • 2011-12-18
      • 1970-01-01
      • 2011-06-23
      • 2016-06-22
      • 1970-01-01
      相关资源
      最近更新 更多