账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    基于phpx的扩展运行报错undefined symbol
    36
    0

    使用phpx写了一个简单的容器,想放到php中运行做点测试。我在这之前已经成功的写了一个dispatch_function注册到了swoole中,而且运行正常。
    后面我又写了个C++类,新建了个PHP类,并将C++类的各个方法注册到了PHP类中。编译通过了,但是PHP加载这个扩展却失败了,报错

    PHP Warning:  PHP Startup: Unable to load dynamic library '/mypath/mango.so' (tried: /mypath/mango.so (/mypath/mango.so: undefined symbol: _ZN7Context4poolE)...
    

    C++源代码如下

    #include <string>
    #include <iostream>
    #include <unordered_map>
    
    #include "../include/phpx.h"
    #include <ext/spl/spl_iterators.h>
    #include <server.h>
    
    using namespace std;
    using namespace php;
    
    int dispatch_function(swServer *serv, swConnection *conn, swEventData *data); 
    
    class Context {
    private:
        static unordered_map<int, char *> pool;
    public:
        void static get(Object &_this, Args &args, Variant &retval) {
            int key = args[0].toInt();
            char * value = pool[key];
            if (value == NULL) return;
            retval = value;
        }
        void static set(Object &_this, Args &args, Variant &retval) {
            int key = args[0].toInt();
            char * value = args[1].toCString();
            pool[key] = value;
        }
        void static del(Object &_this, Args &args, Variant &retval) {
            int key = args[0].toInt();
            pool.erase(key);
        }
    };
    PHPX_EXTENSION()
    {
        Extension *ext = new Extension("mango", "0.0.1");
    
        ext->require("swoole");
    
        ext->onStart = [ext]
        {
            Class *c = new Class("CppClass");
            c->addMethod("get", Context::get, STATIC);
            c->addMethod("set", Context::set, STATIC);
            c->addMethod("del", Context::del, STATIC);
         
            ext->registerClass(c);
    
            // 这个函数在PHP中是正常运行的
            swoole_add_function("mango_dispatch_func_1", (void *)dispatch_function);
        };
    
        return ext;
    }
    int dispatch_function(swServer *serv, swConnection *conn, swEventData *data)
    {
        swConnection *from_sock = swServer_connection_get(serv, conn->from_fd);
        int port = swConnection_get_port(from_sock);
        int worker_id;
        if (port == 80 || port == 8589) {
            // http部分使用无状态轮询worker
            uint32_t key = sw_atomic_fetch_add(&serv->worker_round_id, 1);
            worker_id = key % serv->worker_num;
        } else {
            // 长连接部分使用有状态模式
            worker_id = conn->fd % serv->worker_num;
        }
    
        return worker_id;
    }

    MakeFile如下(用的是官方例子中的MakeFile)

    PHP_INCLUDE = `php-config --includes`
    PHP_LIBS = `php-config --libs`
    PHP_LDFLAGS = `php-config --ldflags`
    PHP_INCLUDE_DIR = `php-config --include-dir`
    PHP_EXTENSION_DIR = `php-config --extension-dir`
    
    mango.so: mango.cpp
        c++ -DHAVE_CONFIG_H -g -o mango.so -O0 -fPIC -shared mango.cpp -std=c++11 ${PHP_INCLUDE} -I${PHP_INCLUDE_DIR} -lphpx\
         -I${PHP_INCLUDE_DIR}/ext/swoole/include -I${PHP_INCLUDE_DIR}/ext/swoole
    install: mango.so
        cp mango.so ${PHP_EXTENSION_DIR}/
    clean:
        rm *.so

    由于本人很多年没摸C++了,基本都还给老师了,不知道哪里出了差错,求大佬帮忙看下是哪里的问题。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ぴ夏末ζ烟雨﹌ 普通会员 1楼

      "undefined symbol"通常在编译阶段就报错,因为PHPX是PHP的扩展,它需要PHP的才能运行。如果你的PHPX扩展没有正确安装,或者扩展的依赖没有包含在你的PHP的配置中,那么这个错误就会出现。

      以下是一些可能的解决步骤:

      1. 确保PHPX扩展已经正确安装。你可以通过在命令行中运行"php -v"来检查PHP的版本。如果PHPX扩展没有被正确安装,你可以使用"phpize"命令来安装它。

      2. 确保PHPX扩展的依赖已经被正确安装。你可以通过在命令行中运行"php -d extname=phpx.so"来检查PHPX扩展的依赖是否被正确安装。如果PHPX扩展的依赖没有被正确安装,你需要使用"sudo"命令来运行命令。

      3. 检查你的PHP的配置。在你的PHP配置文件中,你需要确保PHPX扩展被包含在扩展列表中。你可以通过查看PHP的配置文件来检查这一点。

      4. 重启你的PHP服务器。有时候,重启你的PHP服务器可以解决这个问题。你可以通过在命令行中运行"php -S"来重启你的服务器。

      5. 如果以上步骤都无法解决问题,你可能需要查阅PHPX的官方文档或者寻求PHP的社区的帮助。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部