C 的 PHP 扩展无法在 C 库中找到函数

标签 php c linux php-extension

问题

我正在学习创建一个 php 扩展。我为一个基本的 hello world 应用程序创建了一个 php 扩展。但是当我尝试包含我试图结束的 C 库中的函数时,我收到以下错误消息:

PHP 警告:PHP 启动:无法加载动态库 '/usr/lib/php5/20121212/hello.so' -/usr/lib/php5/20121212/hello.so: undefined symbol: nc_open in Unknown on line 0

这个 nc_open() 函数是我试图扩展的库中的关键函数

过程

我已经创建了头文件和配置文件以及我的 c 扩展文件,其中包含:

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_hello.h"
#include <netcdf.h>

...

PHP_FUNCTION(hello_world)
{
    int status;
    int ncid;
    status = nc_open("sample.nc", 0, &ncid);
    RETURN_LONG(status);
}

我已经设置了一个目录(在 Ubuntu 上)并运行 phpize 和配置步骤。我运行的 make 命令没有错误。

在我的 php.ini 文件中,我有 hello.so 扩展名,它指向我创建的文件的符号链接(symbolic link)。

然后我在我的本地机器上重新启动 apache 服务器,然后运行:

php -r 'echo hello_world();'

并得到: -/usr/lib/php5/20121212/hello.so: undefined symbol: nc_open in Unknown on line 0 PHP 警告:模块“xdebug”已加载到第 0 行的“未知”中 PHP fatal error :在第 1 行的命令行代码中调用未定义的函数 hello_world() PHP 堆栈跟踪: PHP 1. {main}() 命令行代码:0

只有当我有来自 netcdf.h 的函数时才会出现错误 仅包含 include 语句不会发生错误。

我尝试过的:

首先我尝试编写一个基本的 c 程序来检查它是否可以工作,我成功地通过编译它:

gcc test.c -lnetcdf -o 测试 并运行 ./Test

我尝试使用以下 MakeFile

LDLIBS = -lnetcdf

但没有成功。

我想要什么:

最好是知道如何让这个库在我的扩展中工作,但我会满足于被指向文档或示例以帮助我理解我需要知道什么来完成这个。

更新

根据 Elliott Frisch 的评论,我尝试了 设置 PHP_RPATHS=/usr/local

将/etc/ld.so.conf 设置为:

include /etc/ld.so.conf.d/*.conf

/usr/lib

将 MakeFile 更改为:

LDLIBS = -lnetcdf

LDFLAGS = -static

我假设/usr/local 是正确的目录,因为它包含 netcdf.so

根据尝试添加建议的功能,我已将以下行添加到我的 config.m4 文件中

PHP_ADD_INCLUDE(/usr/lib)
PHP_ADD_LIBRARY_WITH_PATH(netcdf, /usr/lib, HELLO_SHARED_LIBADD)

不幸的是,我仍然遇到问题,所以我试图理解这些函数的含义,以确保我正确使用它们。 (我需要连接的库是/usr/lib/libnetcdf.a 并且需要包含该文件中的 netcdf.h。)

最佳答案

您需要在 config.m4 中使用 PHP_ADD_LIBRARY_WITH_PATHPHP_ADD_INCLUDE 宏来处理链接。 Autoconf 的宏也有助于查找和验证现有库。

最好的示例可以在 PHP 源代码的 ext 目录中找到。喜欢ext/zlib

PHP_ADD_LIBPATH($ZLIB_DIR/$PHP_LIBDIR, ZLIB_SHARED_LIBADD)
PHP_ZLIB_DIR=$ZLIB_DIR
PHP_ADD_LIBRARY(z,, ZLIB_SHARED_LIBADD)
PHP_ADD_INCLUDE($ZLIB_INCDIR)

更多详细示例请参见 ext/oracle (来自苹果的开源实验室)

PHP_ADD_LIBRARY(clntsh, 1, ORACLE_SHARED_LIBADD)
PHP_ADD_LIBPATH($ORACLE_DIR/lib, ORACLE_SHARED_LIBADD)

关于C 的 PHP 扩展无法在 C 库中找到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23772406/

相关文章:

c - 地址在大小块之后为 0 字节,adrees 未被堆栈、malloc 或释放

linux - 更快的方式来agrep?快速找到每个不匹配的字符

Java 数据结构文件 StackOverflowError

php - 将 HTTP POST JSON 参数发送到 PHP 页面 - iOS

php - Preg_match_all() - 正则表达式太大

php - Angularjs如何获取服务中$http响应返回的Json格式的解析数据

Linux 用户无法登录 (/bin/nologin)

php - 使用 foreach 循环发布动态生成的文本框

c - 时间相关函数和多线程

c - C 如何以 double 数据类型存储 1001 位数?