2010-01-03 2 views
0

Я думаю, что это вопрос automake.Составив демо-версию cal3d «cally» (3d-модельная библиотека с анимацией с костями)

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

я борюсь с номически демо Cal3D. Первая проблема, с которой я столкнулся, заключалась в отсутствии базы кода Cal3D #include <cstring> and #include <memory> in a lot of places.

Выполнение этого каждый раз, когда я получил ошибку в любом исходном файле в Cal3d, было достаточно, чтобы я мог скомпилировать его.

чески демо также необходимы некоторые #include <cstring>

Теперь моя проблема заключается в том, что HAVE_SDL_H не определен, когда tick.cpp компилируется. Конфигурация и make-файл, похоже, согласны с тем, что 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" 

Edit:

Я, наконец, составил демо.

Когда я собирал cal3d я добавил #include <cstring> к следующим файлам:

  • SRC/cal3d/hardwaremodel.cpp
  • SRC/cal3d/platform.cpp
  • SRC/cal3d/renderer.cpp
  • SRC/cal3d/submesh.cpp
  • SRC/cal3d_converter.cpp

Когда я скомпилирован чески я добавил #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__, так что Tick :: getTime() также может быть скомпилирован.

Я знаю, что это не правильное исправление, поэтому улучшения очень приветствуются.

  • 64-разрядный OpenSuSE с ядром 2.6.27.
  • GCC: 4.3.2
  • ГНУ Automake: 1.10.1
  • ГНУ 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

Это все из-за реструктуризации в СВД библиотеке.

+0

, пожалуйста, добавьте дополнительную информацию о вашей системе –

ответ

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])

От the autoconf manual:

- Макро: вызов AC_CHECK_HEADERS (заголовок-файл ... [действия, если обретенной], [действия, если-not- found], [includes])

Для каждого файла заголовка файла системного заголовка в существующем списке аргументов, разделенных пробелами, определите файл HAVE_header (во всех столицах). Если указано действие-if-found, это дополнительный код оболочки для выполнения, когда один из файлов заголовков найден. Вы можете дать ему значение «break», чтобы вырваться из цикла в первом матче. Если указано действие-if-not-found, оно выполняется, если один из файлов заголовков не найден.

Таким образом, AC_CHECK_HEADERS([SDL.h]) делает поиск настроит для SDL.h в /usr/include и не находит его, потому что его (новый?) Путь /usr/include/SDL/SDL.h

В качестве временного решения, используйте CPPFLAGS для добавления заголовка системы поиска путей при вызове Configure :

./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:

тесты компиляции Do

«C», используя CC и CPP и расширение использования .c для тестовых программ. Используйте флаги компиляции: CPPFLAGS с CPP, а также CPPFLAGS и CFLAGS с CC.

«C++»

тесты компиляции сделать с помощью CXX и CXXPP, и использовать расширение .C для тестовых программ. Используйте флаги компиляции: CPPFLAGS с CXXCPP, а также CPPFLAGS и CXXFLAGS с CXX.

Перемещение AC_LANG_CPLUSPLUS таким образом, чтобы она по крайней мере, выше AC_CHECK_HEADERS([SDL.h]) должны теперь использовать g++ и CXXFLAGS при попытке компиляции SDL.h, которые должны успех, поскольку SDL_CFLAGS были добавлены в CXXFLAGS. (опять же, это действительно должно быть SDL_CPPFLAGS, но вы не измените SDL ...)

+0

HAVE_SDL_H все еще большая загадка для меня. Пакеты sdl уже были установлены ... – Steinbitglis

+0

Ну а макрос m4 в sdl.m4 должен быть разбит на вашу версию? –

+0

my sdl.m4 идентичен тому, что вставлено в aclocal.m4 в папке cally. Если я каким-то образом создал aclocal.m4, я использую тот же sdl.m4, что и автор проекта cally. – Steinbitglis