代码之家  ›  专栏  ›  技术社区  ›  Steinbitglis

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

  •  0
  • Steinbitglis  · 技术社区  · 16 年前

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

    我正在与Cal3D的Caly演示作斗争。 我遇到的第一个问题是缺少Cal3D代码库 #include <cstring> and #include <memory> in a lot of places .

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

    凯莉的演示也需要一些技巧 #包括<cstring>

    configure和makefile似乎接受SDL安装在我的系统上,但src/tick.cpp中的宏不接受。

    我猜configure.in或其他东西中有某种bug,但我似乎没有找到它到底是什么。

    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"
    

    我终于完成了演示。

    #包括<cstring>

    • src/cal3d/hardwaremodel.cpp
    • src/cal3d/platform.cpp
    • src/cal3d/renderer.cpp
    • src/cal3d/submesh.cpp

    当我编辑时,我加了一句 #包括<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有关的所有内容。我还删除了一个检查_ui386_uuuu或_uuia64_uuuuuu的宏if子句,以便也可以编译Tick::getTime()。

    • 具有2.6.27内核的64位OpenSuSE。
    • GNU汽车制造商:1.10.1
    • SDL库的64位版本随zypper一起安装(通过GUI)。

    解决方案

    在里面 配置.in 改变

    AC_CHECK_HEADERS([SDL.h])
    

    到

    AC_CHECK_HEADERS([SDL/SDL.h])
    

    (然后运行自动恢复和./configure)

    在里面 tick.cpp 将所有检查更改为 HAVE_SDL_H 到 HAVE_SDL_SDL_H

    1 回复  |  直到 16 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    你错过的错误 #include <cstring> #include <memory> 主要是由于GNU头文件中发生的清理:删除了不必要的头文件,因此程序没有为其使用的功能包含正确的头文件,从而导致编译错误。

    关于 HAVE_SDL_H

    您可能需要安装SDL库。一些Linux发行版(如Ubuntu)在库运行时和开发文件之间拆分包,因此您需要同时安装这两个包

    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"
    

    有 未在中定义 config.h . 当你看着 configure.in AC_CHECK_HEADERS([SDL.h])

    the autoconf manual :

    宏:AC_CHECK_头文件(头文件…,[action if found],[action if not found],[includes])

    对于存在的空白分隔参数列表中的每个给定系统头文件头文件,定义HAVE_头文件(所有大写)。如果给定了action If found,则在找到其中一个头文件时执行额外的shell代码。您可以给它一个break值,以便在第一次匹配时中断循环。如果给出了未找到时的操作,则在未找到其中一个头文件时执行该操作。

    AC_检查_头([SDL.h]) 进行配置搜索 SDL.h 在里面 /usr/include /usr/include/SDL/SDL.h

    作为解决方法,请使用 CPPFLAGS

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

    现在您可能需要修复 配置.in

    配置.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配置--cflags -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT 但是那些 -I 和 -D 指令不应以 CFLAGS 无论如何,但在 autoconf manual ). 因此,我要说的是,“在SDL层面”已经出现了一些问题。

    现在看一下 AC_LANG documentation :

    C

    C++

    使用CXX和CXXCPP进行编译测试,并对测试程序使用extension.C。使用编译标志:CPPFLAGS与CxCpp,CPPFLAGS和CXXFLAGS与CXX。

    移动 AC_LANG_CPLUSPLUS AC_检查_头([SDL.h]) 应该现在就用 g++ 和 CXXFLAGS 在试图编译时 SDL.h 从那以后,你会成功吗 SDL_CFLAGS CXXFLAGS . (再说一次,它应该是真的 SDL_CPPFLAGS 但你不会改变SDL…)