【问题标题】:Compiling the cal3d demo "cally" (3d model library with boned animations)编译 cal3d 演示“cally”(带有骨骼动画的 3d 模型库)
【发布时间】:2010-01-03 14:56:19
【问题描述】:

我认为这是一个关于 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() 也可以编译。

我知道这不是一个适当的修复,因此非常欢迎改进。

  • 带有 2.6.27 内核的 64 位 OpenSuSE。
  • GCC: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 库中的重组。

【问题讨论】:

  • 请添加有关您系统的更多信息

标签: sdl autoconf


【解决方案1】:

由于缺少 #include <cstring>#include <memory> 而出现的错误主要是由于 GNU 头文件中发生的清理:删除了不必要的头文件,因此程序不包括他们使用的功能的正确头文件面临编译错误.

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

您可能需要安装 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"

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

来自the autoconf manual

— 宏:AC_CHECK_HEADERS(头文件...,[action-if-found],[action-if-not-found],[includes])

对于存在的以空格分隔的参数列表中的每个给定系统头文件头文件,定义 HAVE_header-file(全部大写)。如果给出了 action-if-found ,则当找到其中一个头文件时执行额外的 shell 代码。你可以给它一个“break”值,以便在第一场比赛中跳出循环。如果给出了action-if-not-found,则在没有找到其中一个头文件时执行。

所以,AC_CHECK_HEADERS([SDL.h])/usr/include 中配置搜索 SDL.h 并没有找到它,因为它的(新?)路径是 /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 结尾(根据autoconf manual)。因此,我想说“在 SDL 级别”已经有问题了。

现在看看AC_LANG documentation

‘C’

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

‘C++’

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

AC_LANG_CPLUSPLUS 向上移动,使其至少在AC_CHECK_HEADERS([SDL.h]) 之上应该使它现在在尝试编译SDL.h 时使用CXXFLAGS,这应该会成功,因为SDL_CFLAGS 已添加到CXXFLAGS . (同样,它应该是 SDL_CPPFLAGS 但你不会更改 SDL...)

【讨论】:

  • HAVE_SDL_H 对我来说仍然是个谜。 sdl 包已经安装...
  • 那么你的版本必须破坏 sdl.m4 中的 m4 宏吗?
  • 我的 sdl.m4 与粘贴到 cally 文件夹中 aclocal.m4 的内容相同。除非我以某种方式生成了 aclocal.m4,否则我将使用与 cally 项目的作者相同的 sdl.m4。
  • 越来越接近...我应该添加的一个细节是该配置抱怨找不到 SDL.h,但不是关于 SDL/SDL.h,但我仍然没有找到正确的宏,我想我必须更改它以检查 HAVE_SDL_SDL_H
  • aclocal.m4 中的内容来自 /usr/share/local/sdl.m4 -- 请参阅 lrde.epita.fr/~adl/autotools.html 以了解自动工具如何相互交互以及与哪些文件交互
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 2012-10-17
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 2017-05-05
相关资源
最近更新 更多