编译cal3d演示“cally”(带有骨架动画的3d模型库)

时间:2010-01-03 14:56:19

标签: sdl autoconf

我认为这是关于automake的问题。

http://home.gna.org/cal3d/

我正在努力解决Cal3D的cally演示。 我遇到的第一个问题是Cal3D代码库缺少#include <cstring> and #include <memory> in a lot of places

每次我在Cal3d中的任何源文件中出错时都这样做就足以让我编译它了。

cally演示还需要一些#include <cstring>

现在我的问题是编译tick.cpp时没有定义HAVE_SDL_H。 configure和makefile似乎接受我的系统上安装了SDL,但src / tick.cpp中的宏没有。

我想在configure.in或者某些东西中存在某种错误,但我似乎并没有发现它是什么。

if g++ -DHAVE_CONFIG_H -I. -I. -I..     -O3 -ffast-math -funroll-all-loops -g -O2 -I/usr/include -I/usr/local/include -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -MT tick.o -MD -MP -MF ".deps/tick.Tpo" -c -o tick.o tick.cpp; \
    then mv -f ".deps/tick.Tpo" ".deps/tick.Po"; else rm -f ".deps/tick.Tpo"; exit 1; fi
tick.cpp:144:5: error: #error "no timer implemented for your plateform"

修改

我终于编译了演示。

当我编译cal3d时,我将#include <cstring>添加到以下文件中:

  • 的src / CAL3D / hardwaremodel.cpp
  • 的src / CAL3D / platform.cpp
  • 的src / CAL3D / renderer.cpp
  • 的src / CAL3D / submesh.cpp
  • 的src / cal3d_converter.cpp

当我编译cally时,我将#include <cstring>添加到以下文件中:

  • 的src / demo.cpp
  • 的src / model.cpp

model.cpp 中,我从

更改了第640行
glBindTexture(GL_TEXTURE_2D, (GLuint)pCalRenderer->getMapUserData(0));

glBindTexture(GL_TEXTURE_2D, *(GLuint*)pCalRenderer->getMapUserData(0));

我还做了一些更加丑陋的修改,让 src / tick.cpp 进行编译。

在src / tick.cpp中我删除了与SDL有关的所有内容。我还删除了一个宏if子句检查__i386__或__ia64__,这样也可以编译Tick :: getTime()。

我知道这不是一个正确的解决方案,所以非常欢迎改进。

  • 64位OpenSuSE,内核为2.6.27。
  • 海湾合作委员会:4.3.2
  • GNU Automake:1.10.1
  • GNU Autoconf 2.63
  • 64位版本的SDL库随zypper一起安装(通过GUI)。

解决方案

configure.in 更改

AC_CHECK_HEADERS([SDL.h])

AC_CHECK_HEADERS([SDL/SDL.h])

(然后运行autoreconf和./configure)

tick.cpp 中的

HAVE_SDL_H的所有检查更改为HAVE_SDL_SDL_H

这完全归功于sdl库的重组。

1 个答案:

答案 0 :(得分:2)

缺少#include <cstring>#include <memory>时出现的错误主要是在GNU标头中发生的清理:删除了包含不必要的标头,因此程序不包括功能的正确标头使用面部编译错误。

关于HAVE_SDL_H,您的Linux发行版很可能缺少软件包。

您可能需要安装SDL库。像Ubuntu这样的Linux发行版在库运行时和开发文件之间拆分了包,所以你需要安装这两个包

sudo apt-get install libsdl1.2-dev

关于:

if g++ -DHAVE_CONFIG_H -I. -I. -I..     -O3 -ffast-math -funroll-all-loops -g -O2 -I/usr/include -I/usr/local/include -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -MT tick.o -MD -MP -MF ".deps/tick.Tpo" -c -o tick.o tick.cpp; \
    then mv -f ".deps/tick.Tpo" ".deps/tick.Po"; else rm -f ".deps/tick.Tpo"; exit 1; fi
tick.cpp:144:5: error: #error "no timer implemented for your plateform"

确实无法编译,因为HAVE_SDL_H中未定义config.h。当您查看configure.in时,您会看到它正在使用AC_CHECK_HEADERS([SDL.h])

来自the autoconf manual

  

- Macro:AC_CHECK_HEADERS(header-file ...,[action-if-found],[action-if-not-found],[include])

     

对于存在的空白分隔参数列表中的每个给定系统头文件头文件,定义HAVE_header-file(在所有大写中)。如果给出action-if-found,则在找到其中一个头文件时执行其他shell代码。你可以给它一个'break'值来突破第一场比赛的循环。如果给出了action-if-not-found,则在找不到其中一个头文件时执行。

因此,AC_CHECK_HEADERS([SDL.h])SDL.h中对/usr/include进行配置搜索,但由于其(新的?)路径为/usr/include/SDL/SDL.h

,因此找不到它

要解决此问题,请在调用configure时使用CPPFLAGS添加系统标头搜索路径:

./configure CPPFLAGS="-I/usr/include/SDL"

现在您可能想要修复configure.in

configure.in使用AM_PATH_SDL(1.2.0),最终会调用sdl-config --cflags来定义SDL_CFLAGS。 (AM_PATH_SDL的实现通常位于/usr/share/aclocal/sdl.m4文件)

# Check for SDL
AM_PATH_SDL(1.2.0)
LDFLAGS="$LDFLAGS $SDL_LIBS"
CXXFLAGS="$CXXFLAGS $SDL_CFLAGS"
AC_CHECK_HEADERS([SDL.h])

AC_LANG_CPLUSPLUS

sdl-config --cflags会返回-I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT,但-I-D指令最终不应以CFLAGS结尾,而应位于CPPFLAGS(根据AC_LANG_CPLUSPLUS autoconf manual)。因此,我会说“在SDL级别已经出现了问题”。

现在看一下AC_LANG documentation

  

“C”

     

使用CC和CPP进行编译测试,并使用扩展名.c进行测试程序。使用编译标志:CPPFLAGS与CPP,CPPFLAGS和CFLAGS与CC。

     

“C ++”

     

使用CXX和CXXCPP进行编译测试,并使用扩展名.C进行测试程序。使用编译标志:带有CXXCPP的CPPFLAGS,带有CXX的CPPFLAGS和CXXFLAGS。

向上移动AC_CHECK_HEADERS([SDL.h])以使其至少高于g++时,现在应该在尝试编译CXXFLAGS时使用SDL.hSDL_CFLAGSCXXFLAGS添加SDL_CPPFLAGS以来。 (再次,它应该是{{1}},但你不会改变SDL ......)