cegui的libtool依赖的问题

我用的cegui的版本是0.7.2
cegui在生libtool的la文件的时候有点问题。

# nm libCEGUIBase.a |grep getWindowRendererModule
U getWindowRendererModule

# nm libCEGUIFalagardWRBase.a|c++filt |grep getWindowRendererModule
0000000000000000 b guard variable for getWindowRendererModule::mod
0000000000000020 b getWindowRendererModule::mod
0000000000000f60 T getWindowRendererModule

从上面的输出可以看出,是libCEGUIBase.a需要getWindowRendererModule这个符号,而getWindowRendererModule这个符号是由libCEGUIFalagardWRBase.a提供的。但是libCEGUIFalagardWRBase.la却把CEGUIBase写到dependency_libs里。于是libtool就把-lCEGUIFalagardWRBase 展开成了/usr/lib64/libCEGUIFalagardWRBase.a /usr/lib64/libCEGUIBase.a。于是链接的时候找不到符号。
/usr/lib64/libCEGUIBase.a(libCEGUIBase_la-CEGUIScheme.o): In function CEGUI::Scheme::loadWindowRendererFactories()':
/usr/soft/CEGUI-0.7.2/cegui/src/CEGUIScheme.cpp:339: undefined reference to
getWindowRendererModule'

之所以libCEGUIFalagardWRBase.la把CEGUIBase写到dependency_libs里,是因为Makefile.am里有这么一句:
libCEGUIFalagardWRBase@cegui_bsfx@_la_LIBADD = $(top_builddir)/cegui/src/libCEGUIBase@cegui_bsfx@.la

如果是动态链接到CEGUI,是没有问题的。因为动态链接的时候,库的顺序不这么重要。而使用静态链接的人很少,所以这个问题不容易被发现。

我最终调整正确后的链接顺序是这样:

-lCEGUIIrrlichtRenderer -lCEGUIBase -lCEGUIFalagardWRBase -lCEGUILibxmlParser -lCEGUISILLYImageCodec

renderer在最前面,然后是cegui base,然后是WindowRenderer,然后是xml module/image module。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥