关于程序实现问题,比较有难度,见内.
现在我们比方有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就发布哪个,不要发错了就行