User Tools

Site Tools


z:cmakeprobleme

Sectormania mit CMake unter Windows

Übersicht über Libraries und Umgebungsvariablen

c:\Daten\Projekte

  Sectormania (Rev. 92)
    bin
    media
    source

  SectormaniaInst

c:\Libraries

  BoostSrc (1.39) = %BOOST_HOME%, %BOOST_ROOT%
    boost
    doc
    libs
    more
    ...

  Etl (-> EtlSrc) = %ETL_HOME%
    include
    lib

  EtlSrc (Rev. 50/57 + kl. Änderungen + CMake-Scripte von Ogre)
    bin
    CMake
    EditableTerrain
    media
    sample

  OgreSdk (-> OgreSrc) = %OGRE_HOME%
    bin
      debug = in %PATH%
      ..
    include
    lib
    media
    ..

  OgreSrc (Rev. 8600 + Dep. 20080203) = %OGRE_SRC%
    CMake
    Components
    Dependencies
    Docs
     ..
    
 PhysFs (-> PhysFsSrc) = %PhysFS_HOME%
    bin
    include
    lib

  PhysFsSrc (2.0.0)
    archivers
    bin
    extras
    lzma
    ..

  PocoSrc (1.3.5) = %POCO_HOME%
    bin
    build
    contrib
    CppUnit
    ..

  ProtoBufSrc (2.1.0) = %ProtoBuf_HOME%
    editors
    examples
    gtest
    java
    ..

  Qt (2009.02) = %QTDIR%, in %PATH%
    .moc
    bin = in %PATH%
    demos
    doc
    ..

Projektdateien mit CMake erzeugen

Erster CMake-Durchlauf:

CMake Error at CMake/Utils/FindPkgMacros.cmake:101 (message):
  Required library CEGUI not found! Install the library (including dev
  packages) and try again.  If the library is already installed, set the
  missing variables manually in cmake.
Call Stack (most recent call first):
  CMake/Packages/FindCEGUI.cmake:42 (findpkg_finish)
  CMakeLists.txt:18 (find_package)

Die FindCEGUI.cmake durch die Version von Ogre ersetzt. Außerdem manuell eingetragen:

CMAKE_INSTALL_PREFIX C:/Daten/Projekte/SectormaniaInst
OGRE_CEGUIRenderer_INCLUDE_DIR C:\Libraries\OgreSdk\include\OGRE\CEGUIRenderer
OGRE_CEGUIRenderer_LIBRARY_DBG C:\Libraries\OgreSdk\lib\debug\CEGUIOgreRenderer_d.lib
OGRE_CEGUIRenderer_LIBRARY_FWK NOTFOUND (?)
OGRE_CEGUIRenderer_LIBRARY_REL C:\Libraries\OgreSdk\lib\release\CEGUIOgreRenderer.lib

Zweiter Durchlauf:

CMake Error at CMake/Utils/FindPkgMacros.cmake:101 (message):
  Required library OIS not found! Install the library (including dev
  packages) and try again.  If the library is already installed, set the
  missing variables manually in cmake.
Call Stack (most recent call first):
  CMake/Packages/FindOIS.cmake:41 (findpkg_finish)
  CMakeLists.txt:19 (find_package)

Also die FindOIS.cmake von OgreSrc übernommen. Dritter Durchlauf:

CMake Error at CMake/Utils/FindPkgMacros.cmake:101 (message):
  Required library ProtoBuf not found! Install the library (including dev
  packages) and try again.  If the library is already installed, set the
  missing variables manually in cmake.
Call Stack (most recent call first):
  CMake/Packages/FindProtoBuf.cmake:32 (findpkg_finish)
  CMakeLists.txt:21 (find_package)

Manuell eingetragen:

PHYSFS_INCLUDE_DIR C:/Libraries/PhysFs/include
PHYSFS_LIBRARY C:/Libraries/PhysFs/lib/physfs.lib
ProtoBuf_INCLUDE_DIR C:/Libraries/ProtoBufSrc/src
ProtoBuf_LIBRARY_DBG C:/Libraries/ProtoBufSrc/vsprojects/Debug/libprotobuf.lib
ProtoBuf_LIBRARY_REL C:/Libraries/ProtoBufSrc/vsprojects/Release/libprotobuf.lib

Danach lief CMake erst einmal durch, die Projektdatei wurde in C:\Daten\Projekte\Sectormania\bin erzeugt.

Kompilieren in Visual-Studio

SharedLib
1>..\..\source\shared_lib\src\Localisation.cpp(4) : fatal error C1083: Cannot open include file: 'Poco/DOM/DOMParser.h': No such file or directory
1>..\..\source\shared_lib\src\FileSystem.cpp(6) : fatal error C1083: Cannot open include file: 'physfs.h': No such file or directory
(... Durchlauf 2 ...)
1>..\..\source\shared_lib\src\FileSystem.cpp(12) : fatal error C1083: Cannot open include file: 'Poco/Util/PropertyFileConfiguration.h': No such file or directory

Zu den include-Pfaden hinzugefügt: (nur C:\Libraries\PocoSrc\Foundation\include war eingetragen, PhysFS fehlte vollständig)

  • C:\Libraries\PocoSrc\XML\include
  • C:\Libraries\PocoSrc\Util\include
  • C:\Libraries\PhysFs\include

Damit kompiliert die SharedLib.

TestSharedLib

Kein Problem.

Sectormania
1>..\..\source\game\src\GUI\Manager.cpp(44) : error C2039: 'Warnings' : is not a member of 'CEGUI'
1>..\..\source\game\src\GUI\Manager.cpp(44) : error C2065: 'Warnings' : undeclared identifier
1>..\..\source\game\src\GUI\Manager.cpp(44) : error C2051: case expression not constant

Zeile 44 + 45 auskommentiert, dann ließ sich Sectormania kompilieren.

ObjEditor
1>c:\daten\projekte\sectormania\source\object_editor\OgreWidget.h(5) : fatal error C1083: Cannot open include file: 'QGLWidget': No such file or directory
1>..\..\source\object_editor\OgreManager.cpp(42) : error C2440: 'initializing' : cannot convert from 'const Ogre::RenderSystemList' to 'Ogre::RenderSystemList *'
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

C:\Libraries\Qt\include\QtOpenGL zu den include-Pfaden hinzugefügt. Zeile 42ff in der OgreManager.cpp geändert:

Ogre::RenderSystemList list = mRoot->getAvailableRenderers();
mRoot->setRenderSystem(list[0]);

Und es kompiliert.

MapEditor
1>..\..\source\map_editor\OgreManager.cpp(43) : error C2440: 'initializing' : cannot convert from 'const Ogre::RenderSystemList' to 'Ogre::RenderSystemList *'
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>c:\daten\projekte\sectormania\source\map_editor\Util.h(5) : fatal error C1083: Cannot open include file: 'boost/random/mersenne_twister.hpp': No such file or directory

Der erste Fehler, wie schon beim Objekt-Editor gefixt. C:\Libraries\BoostSrc zu den include-Pfaden hinzugefügt. Danach jede Menge Linker-Fehler. Nach dem Hinzufügen von C:\Libraries\Etl\lib\EditableTerrain_d.lib zu den Linker-Input-Files blieb übrig:

1>TerrainManager.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall TerrainManager::metaObject(void)const " (?metaObject@TerrainManager@@UBEPBUQMetaObject@@XZ)
1>TerrainManager.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall TerrainManager::qt_metacast(char const *)" (?qt_metacast@TerrainManager@@UAEPAXPBD@Z)
1>TerrainManager.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall TerrainManager::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@TerrainManager@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>BrushControlWidget.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall BrushControlWidget::metaObject(void)const " (?metaObject@BrushControlWidget@@UBEPBUQMetaObject@@XZ)
1>BrushControlWidget.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall BrushControlWidget::qt_metacast(char const *)" (?qt_metacast@BrushControlWidget@@UAEPAXPBD@Z)
1>BrushControlWidget.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall BrushControlWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@BrushControlWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>BrushControlWidget.obj : error LNK2019: unresolved external symbol "protected: void __thiscall BrushControlWidget::changedShape(class QString const &)" (?changedShape@BrushControlWidget@@IAEXABVQString@@@Z) referenced in function "public: void __thiscall BrushControlWidget::setShape(class QString const &)" (?setShape@BrushControlWidget@@QAEXABVQString@@@Z)
1>BrushControlWidget.obj : error LNK2019: unresolved external symbol "protected: void __thiscall BrushControlWidget::changedMirrorMode(int)" (?changedMirrorMode@BrushControlWidget@@IAEXH@Z) referenced in function "public: void __thiscall BrushControlWidget::setMirrorModeDisabled(bool)" (?setMirrorModeDisabled@BrushControlWidget@@QAEX_N@Z)
1>BrushControlWidget.obj : error LNK2019: unresolved external symbol "protected: void __thiscall BrushControlWidget::changedSize(int,int,bool,bool)" (?changedSize@BrushControlWidget@@IAEXHH_N0@Z) referenced in function "public: void __thiscall BrushControlWidget::setSize(int)" (?setSize@BrushControlWidget@@QAEXH@Z)
1>BrushControlWidget.obj : error LNK2019: unresolved external symbol "protected: void __thiscall BrushControlWidget::changedStrength(int,int,bool,bool)" (?changedStrength@BrushControlWidget@@IAEXHH_N0@Z) referenced in function "public: void __thiscall BrushControlWidget::setStrength(int)" (?setStrength@BrushControlWidget@@QAEXH@Z)
1>BrushControlWidget.obj : error LNK2019: unresolved external symbol "protected: void __thiscall BrushControlWidget::changedRotation(int,int,bool,bool)" (?changedRotation@BrushControlWidget@@IAEXHH_N0@Z) referenced in function "public: void __thiscall BrushControlWidget::setRotation(int)" (?setRotation@BrushControlWidget@@QAEXH@Z)
1>BrushControlWidget.obj : error LNK2019: unresolved external symbol "protected: void __thiscall BrushControlWidget::changedFade(int,int,bool,bool)" (?changedFade@BrushControlWidget@@IAEXHH_N0@Z) referenced in function "public: void __thiscall BrushControlWidget::setFade(int)" (?setFade@BrushControlWidget@@QAEXH@Z)

Dies ließ sich beheben, indem man TerrainManager.h und BrushControlWidget.h in der CMakeLists.txt zu OBJEDIT_MOC_FILES hinzugefügt und die Projektdatei mit CMake neu erstellt (habe die Änderung jetzt in Rev. 93 eingecheckt). Danach wieder jede Menge Linker-Probleme, die sich durch Hinzufügen von C:\Libraries\Etl\lib\EditableTerrain_d.lib zum Linker beheben ließen.

ALL_BUILD

Damit lief ALL_BUILD auch ohne Probleme durch.

INSTALL

Kopiert im Moment nur die SectorMania.exe nach C:\Daten\Projekte\SectormaniaInst\bin. Ist damit natürlich nicht ausführbar.

Ausführen der Programme

Die Binaries sind alle in C:\Daten\Projekte\Sectormania\bin\bin\Debug gelandet, anstatt der dafür im Repository vorgesehenen Verzeichnisse C:\Daten\Projekte\Sectormania\bin\map_editor\debug etc. Damit fehlen resources.cfg, plugins.cfg etc. Kopiert man diese zurück (und entfernt die QT-DLLs, die nicht zu meiner Version von QT passen ;)), dann laufen die Editoren.

Die Sectormania.exe beschwert sich noch über ein paar DLLs (PocoFoundationd.dll, PocoXMLd.dll, PocoUtild.dll, physfs.dll), die man entweder in %PATH% packen muss, oder ins Binary-Verzeichnis kopieren muss. Wenn man dann noch die plugins.cfg von einem der Editoren klaut, läuft es.

z/cmakeprobleme.txt · Last modified: 2015/08/23 13:59 (external edit)