0

これはautomakeに関する質問だと思います。

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

Cal3D のひどいデモに苦労しています。最初に遭遇した問題は、Cal3D コード ベースが見つから#include <cstring>#include <memory>、多くの場所にあることでした。

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 に関係するすべてのものを削除しました。Tick::getTime() もコンパイルできるように、__i386__ または __ia64__ をチェックする if 句のマクロも削除しました。

これが適切な修正ではないことはわかっているので、改善は大歓迎です。

  • 2.6.27 カーネルの 64 ビット OpenSuSE。
  • GCC: 4.3.2
  • GNU オートメイク: 1.10.1
  • GNU Autoconf 2.63
  • SDL ライブラリの 64 ビット バージョンは、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 ライブラリの再構築によるものです。

4

1 に答える 1

2

#include <cstring>行方不明で発生したエラー#include <memory>は、主に GNU ヘッダーで発生したクリーンアップによるものです。不要なヘッダーのインクルードが削除されたため、使用する機能の適切なヘッダーが含まれていないプログラムは、コンパイル エラーに直面します。

についてHAVE_SDL_H、お使いの Linux ディストリビューションにパッケージが不足している可能性があります。

おそらく、SDL ライブラリをインストールする必要があります。Ubuntu などの一部の Linux ディストリビューションでは、パッケージがライブラリ ランタイムと dev ファイルに分割されているため、両方のパッケージをインストールする必要があります。

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 (ヘッダーファイル...、[見つかった場合のアクション]、[見つからない場合のアクション]、[インクルード])

存在する空白で区切られた引数リスト内の特定のシステム ヘッダー ファイル header-file ごとに、HAVE_header-file (すべて大文字) を定義します。action-if-found が指定されている場合、ヘッダー ファイルの 1 つが見つかったときに実行する追加のシェル コードです。'break' の値を指定すると、最初の一致でループから抜け出すことができます。action-if-not-found が指定されている場合、ヘッダー ファイルの 1 つが見つからない場合に実行されます。

そのため、AC_CHECK_HEADERS([SDL.h])構成検索を作成SDL.h/usr/include、その(新しい?)パスが/usr/include/SDL/SDL.h

CPPFLAGS回避策として、構成を呼び出すときにシステム ヘッダーの検索パスを追加するために使用します。

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

今、あなたは修正したいかもしれませんconfigure.in

configure.indefineAM_PATH_SDL(1.2.0)を呼び出すことになるものを使用します。(通常、の実装はファイルにあります)sdl-config --cflagsSDL_CFLAGSAM_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とにかくで終了するのではなく、むしろ終了する必要があります( autoconfマニュアルCPPFLAGSに従って)。したがって、「SDLレベルで」すでに何か問題があると言えます。

AC_LANGドキュメントを見てみましょう:

'C'</p>

CC と CPP を使用してコンパイル テストを行い、テスト プログラムに拡張子 .c を使用します。コンパイル フラグを使用します。CPP では CPPFLAGS、CC では CPPFLAGS と CFLAGS の両方を使用します。

「C++」</p>

CXX および CXXCPP を使用してコンパイル テストを行い、テスト プログラムに拡張子 .C を使用します。コンパイル フラグを使用します。CXXCPP では CPPFLAGS、CXX では CPPFLAGS と CXXFLAGS の両方を使用します。

AC_LANG_CPLUSPLUS少なくとも上に移動してAC_CHECK_HEADERS([SDL.h])、今すぐ使用できるようにし、コンパイルを試みるときにg++成功するようにします。(繰り返しますが、実際にはそうあるべきですが、SDL は変更しません...)CXXFLAGSSDL.hSDL_CFLAGSCXXFLAGSSDL_CPPFLAGS

于 2010-01-06T19:05:36.983 に答える