0

我认为这是一个关于汽车制造的问题。

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

我正在为 Cal3D 的 cally 演示而苦苦挣扎。我遇到的第一个问题是 Cal3D 代码库在很多地方都丢失#include <cstring>#include <memory>

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

凯莉演示还需要一些#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 相关的所有内容。我还删除了检查 __i386__ 或 __ia64__ 的宏 if 子句,以便也可以编译 Tick::getTime()。

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

  • 带有 2.6.27 内核的 64 位 OpenSuSE。
  • 海湾合作委员会:4.3.2
  • GNU 自动制作:1.10.1
  • GNU 自动配置 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_HHAVE_SDL_SDL_H

这都是由于 sdl 库中的重组。

4

1 回答 1

2

您丢失的错误#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])

autoconf 手册

— 宏: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])使 configure 搜索SDL.hin/usr/include并没有找到它,因为它的(新?)路径是/usr/include/SDL/SDL.h

作为一种解决方法,CPPFLAGS在调用配置时使用添加系统头搜索路径:

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

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

configure.inAM_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 手册)。因此,我会说“在 SDL 级别”已经有问题了。

现在看看AC_LANG文档

'C'</p>

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

'C++'</p>

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

向上移动,AC_LANG_CPLUSPLUS以便它至少在上面AC_CHECK_HEADERS([SDL.h])应该使它现在可以使用g++,并且CXXFLAGS在尝试编译时SDL.h应该成功,因为它SDL_CFLAGS被添加到CXXFLAGS. (同样,它确实应该是,SDL_CPPFLAGS但您不会更改 SDL ......)

于 2010-01-06T19:05:36.983 回答