我认为这是关于automake的问题。
我正在努力解决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>
添加到以下文件中:
当我编译cally时,我将#include <cstring>
添加到以下文件中:
在 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()。
我知道这不是一个正确的解决方案,所以非常欢迎改进。
解决方案
在 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库的重组。
答案 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])
- 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.h
和SDL_CFLAGS
自CXXFLAGS
添加SDL_CPPFLAGS
以来。 (再次,它应该是{{1}},但你不会改变SDL ......)