将Ogre的骨骼代码与天龙八部的骨骼代码编译进同一个Dll文件

zyfu0000 2009-12-08 04:52:02
由于天龙八部的骨骼SkeletonSerializer类有变动,而且只变动了一个函数的实现。我要怎样才能将这连个函数实现都编译进Dll中,然后根据预定义来选择调用哪个实现?
我本来是这样想的:

class _declspec(dllexport) A
{
public:
A()
{}
~A()
{}
#ifdef TLBB
bool getA()
{
return 1;
}
#else
bool getA()
{
return 0;
}
#endif
};

编译成Dll和Lib,然后在程序里根据预定义TLBB分别调用A的getA()方法,发现其实是行不通的,因为在Dll编译阶段会根据Dll工程中的预定义符来条件编译判断将哪个实现编译进Dll中。
请问还有别的办法吗?
...全文
461 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
styletree 2009-12-18
  • 打赏
  • 举报
回复
本来玩游戏起初的想法只是为了消遣解闷
可是慢慢意识到自己有沉迷的迹象,良心发现想早点离开
chuxuanyi 2009-12-16
  • 打赏
  • 举报
回复
天龙八部没有做下去的必要了,游戏进不去,把玩家不当一回事,垃圾游戏的垃圾客服
zyfu0000 2009-12-16
  • 打赏
  • 举报
回复
我们又不是天龙八部的维护人员,我们只是在研究它而已。
话说畅游买了U3了,估计核心程序员在搞什么大工程了,对天龙八部不管情理之中。
zyfu0000 2009-12-13
  • 打赏
  • 举报
回复
那个我已经实现了。
我是问将下面两段代码同时编译进Dll要怎么办?

class _declspec(dllexport) A
{
public:
A()
{}
~A()
{}

bool getA1()
{
return 1;
}

bool getA2()
{
return 0;
}

};


#ifdef TLBB
#define getA getA1
#else
#define getA getA2
#endif
大叔才是主流 2009-12-12
  • 打赏
  • 举报
回复
...
你都已经解决了...最好的办法你都找到了其实...

更改函数源码,增加一个标志判断,

2种情况下的骨骼用一个函数都可以加载,不是很好么?

zyfu0000 2009-12-12
  • 打赏
  • 举报
回复
晓得了,昨天用上官洪大哥的TTLBMeshViewer试了下,改成TLBB的骨骼代码后,还是可以正常加载Ogre本身的骨骼的,没有产生什么问题,里面只是加了个标志判断而已。


但上面提到的情况有没有办法解决?
大叔才是主流 2009-12-12
  • 打赏
  • 举报
回复
Ogre骨骼文件的结构非常简单,就是XML形式的2进制文件罢了,可以转换成XML,一目了然.
大叔才是主流 2009-12-12
  • 打赏
  • 举报
回复
直接更改OGRE源码重新编译就行了塞
zyfu0000 2009-12-11
  • 打赏
  • 举报
回复
或者能不能将下面的

#ifdef TLBB
#define getA getA1
#else
#define getA getA2
#endif

也编译到Dll中?
zyfu0000 2009-12-11
  • 打赏
  • 举报
回复
谢谢回复!
这种方法理论上可行,但只适合调用层次比较高的函数,如果是个底层函数的话,往上的调用函数就都需要两份拷贝,尤其像Ogre这种对象行为型设计模式的程序,一层一层的调用,这时各层函数就都需要两份拷贝了。
这时可以在调用调用函数里加以判断标志位表示是A1或者A2,但现在的问题是天龙八部的Skeleton文件结构不懂,无法设置标志位。而且Ogre骨骼调用很繁琐。搞了半天没弄清流程!!
glacier3d 2009-12-09
  • 打赏
  • 举报
回复
class _declspec(dllexport) A
{
public:
A()
{}
~A()
{}

bool getA1()
{
return 1;
}

bool getA2()
{
return 0;
}

};

.h里
#ifdef TLBB
#define getA getA1
#else
#define getA getA2
#endif

使用时:
A* p = ...
p->getA();

----------------------
类似windows API里ASicll版本和Unicode版本的处理
zyfu0000 2009-12-09
  • 打赏
  • 举报
回复
自己顶一个!
zyfu0000 2009-12-08
  • 打赏
  • 举报
回复
不是宏,是使用VS的预定义器来编译Dll,就是相当于根据预定义Unicode没有来判断TCHAR是char还是wchar_t一样,还有预定义WINDOWS来表示是窗口程序还是控制台程序。
就是想在程序中根据预定义TLBB没有来判断要调用哪个实现代码段。比如说,预定义了就调用TLBB的骨骼实现,没有的话就调用OGRE本身的骨骼实现。所以就是想把这个功能编译到一起到同一个Dll中。
xingzhe2001 2009-12-08
  • 打赏
  • 举报
回复
用宏当然不可以了
张赐 2009-12-08
  • 打赏
  • 举报
回复
不太明白你的意思

是不是要动态编译
huazai434 2009-12-08
  • 打赏
  • 举报
回复
强人,学习!初学OGRE

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧