Windows vs. Linux vs. Mac:具有相同结构名称和一些共享文件的不同php扩展

时间:2017-03-16 23:15:34

标签: php c++ macos linker functor

我有两个php扩展--A和B.

在a.h中我有:

struct foo : public functor {
    virtual void operator()( some parameters ); 
};

在b.h中,我也有同样的事情

struct foo : public functor {
    virtual void operator()( some parameters ); 
};

Functor在shared.h中声明,在两个扩展名之间共享

struct functor {
    virtual void operator()( some parameters );
};

void foo :: operator()(某些参数)在a2.cpp和b2.cpp中的实现方式不同。

在a1.cpp中,我有一个在扩展A中使用的仿函数列表:

const functor a_func[] = {
    func1(new func1),
    func2(new func2),
    foo(new foo),
    func4(new func4)
};

在b2.cpp中,我有一个类似的列表:

const functor b_func[] = {
    func1(new func1),
    foo(new foo),
    func3(new func3),
    func4(new func4)
};

函数foo在shared.cpp中调用

const functor* func = get_func( functors );
*func( some arguments );

其中'仿函数'是a_func或b_func,并且根据您正在使用的API,从扩展名A或扩展名B调用shared.cpp。

我目前面临的问题是,当在Mac上测试扩展B并且在扩展B在php.ini中加载扩展A时,使用a2.cpp中定义的foo函数而不是b2。 CPP。但如果我在php.ini中颠倒顺序,一切正常。当我调试它时,我看到传入get_func()的仿函数列表是正确的(即b_func)。

我尝试使用命名空间或重命名A和B中的foo函数来解决问题。但令我困惑的是,扩展程序一直在Windows和Linux上运行,但现在它在Mac上有这个名称定义问题。

1 个答案:

答案 0 :(得分:0)

以防万一其他人在想。这是因为MacOS具有平面命名空间的默认配置。要解决此问题,您需要在配置文件中输入MACOSX_DEPLOYMENT_TARGET= sw_vers -productVersion。