我有两个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上有这个名称定义问题。
答案 0 :(得分:0)
以防万一其他人在想。这是因为MacOS具有平面命名空间的默认配置。要解决此问题,您需要在配置文件中输入MACOSX_DEPLOYMENT_TARGET=
sw_vers -productVersion。