PHP Ссылка на общую библиотеку в расширении

Я работаю над собственным расширением PHP, которое включает символы из общей библиотеки, но я не могу получить config.m4 файл для генерации процедуры сборки, включающей необходимые параметры компоновщика для правильной связи с общей библиотекой. Это то, что у меня есть в моем config.m4 файл до сих пор:

PHP_ARG_ENABLE(myextension, whether to enable MyExtension support, [ --enable-myextension   Enable MyExtension support])

if test "$PHP_MYEXTENSION" = "yes"; then

LIBNAME=otherlibrary
LIBSYMBOL=otherlib_some_function
LIBOTHERLIB_LIBS=`pkg-config --libs otherlibrary`
LIBOTHERLIB_INC=`pkg-config --cflags otherlibrary`

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
[
PHP_EVAL_INCLINE($LIBOTHERLIB_INC)
PHP_EVAL_LIBLINE($LIBOTHERLIB_LIBS)
AC_DEFINE(HAVE_MYEXTENSION, 1, [Whether you have MyExtension])
],[
AC_MSG_ERROR([wrong lib$LIBNAME version or library not found])
])

PHP_NEW_EXTENSION(myextension, myextension.c, $ext_shared)
fi

libotherlibrary Библиотека находится в стандартном системном расположении. Когда я phpize с этой конфигурацией, а затем выполнить сгенерированный configure сценарий с --enable-myextension Аргумент успешно генерирует Makefile и т.д., и я вижу, что это делает тест для otherlib_some_function от libotherlibrary который проходит. Но зовет ldd на моем результате myextension.so дает только:

linux-vdso.so.1 (0x00007ffd11fce000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f741e653000)
/lib64/ld-linux-x86-64.so.2 (0x00007f741ec26000)

так что нет упоминания о libotherlibrary, И libtool а также cc команды, которые выполняются Makefile не включать -lotherlibrary вариант. И затем, когда я пытаюсь выполнить скрипт PHP, который использует мое расширение, я получаю:

php: symbol lookup error: /path/to/modules/myext.so: undefined symbol: otherlib_some_function

На месте PHP_EVAL_INCLINE а также PHP_EVAL_LIBLINE Я также попробовал PHP_ADD_LIBRARY макрос:

PHP_ADD_LIBRARY($LIBNAME,,OTHERLIB_SHARED_LIBADD)

(Я не понимаю, для чего третий аргумент этого макроса.)

Я также пытался (в сочетании с обоими из вышеупомянутых), в том числе пятый аргумент PHP_CHECK_LIBRARY называется extra-libs передавая значение моего $LIBOTHERLIB_LIBS переменная. Это ничего не исправляет, и нет документации о том, что этот аргумент должен делать или какие значения он требует. Так что это всего лишь предположение.

Итак, как я могу получить мое расширение для сборки с необходимыми -lotherlibrary вариант компоновщика?

3

Решение

Вам нужно использовать PHP_ARG_WITH вместо PHP_ARG_ENABLE + плюс еще несколько изменений. Вот пример, который работает для меня. замещать libxyz по имени вашей внешней библиотеки:

config.m4

dnl If your extension references something external, use with:

PHP_ARG_WITH(libxyz, for libxyz support,
Make sure that the comment is aligned:
[  --with-libxyz             Include libxyz support])

dnl Otherwise use enable:

dnl PHP_ARG_ENABLE(libxyz, whether to enable libxyz support,
dnl Make sure that the comment is aligned:
dnl [  --enable-libxyz           Enable libxyz support])

if test "$PHP_LIBXYZ" != "no"; then
dnl Write more examples of tests here...

dnl # --with-libxyz -> check with-path
SEARCH_PATH="/usr/local /usr"SEARCH_FOR="/include/libxyz.h"if test -r $PHP_LIBXYZ/$SEARCH_FOR; then # path given as parameter
LIBXYZ_DIR=$PHP_LIBXYZ
else # search default path list
AC_MSG_CHECKING([for libxyz files in default path])
for i in $SEARCH_PATH ; do
if test -r $i/$SEARCH_FOR; then
LIBXYZ_DIR=$i
AC_MSG_RESULT(found in $i)
fi
done
fi
dnl
if test -z "$LIBXYZ_DIR"; then
AC_MSG_RESULT([not found])
AC_MSG_ERROR([Please reinstall the libxyz distribution])
fi

dnl # --with-libxyz -> add include path
PHP_ADD_INCLUDE($LIBXYZ_DIR/include)

dnl # --with-libxyz -> check for lib and symbol presence
LIBNAME=libxyz
LIBSYMBOL=libxyz_lib_version

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
[
PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $LIBXYZ_DIR/lib, LIBXYZ_SHARED_LIBADD)
AC_DEFINE(HAVE_LIBXYZLIB,1,[ ])
],[
AC_MSG_ERROR([wrong libxyz lib version or lib not found])
],[
-L$LIBXYZ_DIR/lib -lm
])

PHP_SUBST(LIBXYZ_SHARED_LIBADD)

PHP_NEW_EXTENSION(libxyz, libxyz.c, $ext_shared)
fi

Проверь это: http://php.net/manual/de/internals2.buildsys.configunix.php

1

Другие решения

Моя рабочая версия теперь выглядит так:

PHP_ARG_ENABLE(myextension, whether to enable MyExtension support, [ --enable-myextension   Enable MyExtension support])

if test "$PHP_MYEXTENSION" = "yes"; then

LIBNAME=otherlibrary
LIBSYMBOL=otherlib_some_function
LIBOTHERLIB_LIBS=`pkg-config --libs otherlibrary`
LIBOTHERLIB_INC=`pkg-config --cflags otherlibrary`

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
[
PHP_ADD_LIBRARY($LIBNAME,1,OTHERLIBRARY_SHARED_LIBADD)
PHP_SUBST(OTHERLIBRARY_SHARED_LIBADD)
AC_DEFINE(HAVE_MYEXTENSION, 1, [Whether you have MyExtension])
],[
AC_MSG_ERROR([wrong lib$LIBNAME version or library not found])
])

PHP_NEW_EXTENSION(myextension, myextension.c, $ext_shared)
fi

Эта техника использует pkg-config найти разделяемую библиотеку, так что, возможно, она не будет такой переносимой, как явный поиск @ hek2mgl.

Основным дополнением является использование PHP_SUBST макрос, который «добавляет переменную со значением в Makefile» (в соответствии с aclocal.m4 тот phpize создано). Похоже что макрос PHP_ADD_LIBRARY, задокументированный как «добавить библиотеку в строку ссылки», фактически ничего не добавляет к вашему Makefile, Вместо этого вы указываете имя переменной в качестве третьего аргумента (задокументировано как «shared-libadd»), а затем вызываете PHP_SUBST обновить эту переменную в Makefile,

1

Прости мое невежество, но это может быть хакерским решением, так как я не слишком хорош в m4.

Это работает для меня с PHP-7.0

if test "$PHP_MYMOD" != "no";
then
LIBNAME=my_dank_lib
LIBSYMBOL=my_dank_lib_function_name
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
[
PHP_ADD_LIBRARY($LIBNAME, 1, EXTRA_CFLAGS)
PHP_SUBST(EXTRA_CFLAGS)
AC_DEFINE([MYMOD],1 ,[whether to enable mymod support])
AC_HEADER_STDC
],[
AC_MSG_ERROR([Uh oh, library $LIBNAME was not found with the function $LIBSYMBOL in it.])
])PHP_NEW_EXTENSION(mymod,
mymod.c,
$ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
fi

Я пришел к такому выводу после того, как увидел в make-файле EXTRA_CFLAGS был определен по умолчанию. И, содержание EXTRA_CFLAGS был добавлен в заявление о сборке mymod.lo,

Таким образом, используя PHP_SUBST(EXTRA_CFLAGS) пробирается туда. После запуска ./configure зайдите в свой make-файл и убедитесь сами!

0
По вопросам рекламы [email protected]