日期:2014-05-16  浏览次数:20682 次

关于程序实现问题,比较有难度,见内.
现在我们比方有A,B,C,D四个地方的项目,而对于我们的源代码来说都是一套,只是在某些地方各地有各地的差异,现在比如这四个地方都要校验用户状态(这个里面可能有很多逻辑),现在我们能不能做成A.so,B.so,C.so,D.so,每个so也对应于一个目录,版本发布时,比如发布到A地方去,我只取A目录,别的目录都不取.
我的应用程序是     建立在.so   之上的,动态加载.

现在我有个想法(比如校验用户状态):
目录   ABCD的父类:   CheckUserStateBase   这是基类,定义流程中调用的虚方法
同级的目录是:         ACheckUserStateBase   A项目目录   :public   CheckUserStateBase
同级的目录是:         BCheckUserStateBase:public   CheckUserStateBase
同级的目录是:         CCheckUserStateBase:public   CheckUserStateBase
同级的目录是:         DCheckUserStateBase:public   CheckUserStateBase
每个项目的目录是将   基类中的方法实现.
然后再建立四个同级的目录中,分别都写一个对外接口,方法名与参数都一样.
然后我编译时   我将   [-]BCheckUserStateBase(只允许一个目录存在)   编译成   UserStateBase.so(这个时间我把CheckUserStateBase.so   链进去   ),   我在应用程序中我open时,会去open   动态库   CheckUserStateBase.so     中的   XXX   方法,这样   我保证了基类接口不变,各地项目实现后开放接口,对于应用程序来说调用的都是同一个库里的同一个方法,当然同一个库,是我们做了手脚的,这样对于实施时,是不是可以做到与别的项目的代码的无关性?

是不是还有更好的方法,请告诉我,谢谢~~~




------解决方案--------------------
这是一个动态调用的问题.
你说的大体方向没有错.

你可以参考一下那些开源软件里面附带plugin的项目的实现方式.比如eclipse等
------解决方案--------------------
你可以编译成A.so/B.so/C.so/D.so
但是发布的时候只发布任意一个.so,注意不要发多了
然后在主程序中调用dlopen去试着一个一个调啊,
代码大体上类似如下
void* OpenCheckSO( void )
{
void* lib;//实际情况要考虑.so的路径
lib = dlopen( "A.so ", RTLD_NOW );
if ( lib != NULL ) return lib;
lib = dlopen( "B.so ", RTLD_NOW );
if ( lib != NULL ) return lib;
lib = dlopen( "C.so ", RTLD_NOW );
if ( lib != NULL ) return lib;
lib = dlopen( "D.so ", RTLD_NOW );
if ( lib != NULL ) return lib;
return NULL;
}

打开了动态库后,再用dlsym( lib, "CheckUserState " );就可以得到函数的地址了
然后就可以调用你的check函数

也就是你发布的时候想发布哪个so就发布哪个,不要发错了就行