Seite 1 von 1

Tokomak in Qt

Verfasst: 28. Juli 2009 19:33
von streikbrecher
Hallo,
ich versuche gerade die Tokamak Physik-Engine in ein erweitertes open-gl-Beispiel einzubinden.

Ich hab dazu die Version aus diesem Tutorial geholt, und die Ordnerstruktur von Tokamak in mein QT-Verzeichnis übernommen. (Also .lib in \2009.01\qt\lib, .h in \2009.01\qt\include...)

Jetzt setzte ich die ersten Teile des Codes aus dem Tutorial in meine glwidget.cpp ein, also:

Code: Alles auswählen

#include <tokamak.h>
#pragma comment(lib, "tokamak.lib")

neSimulator *gSim = NULL;
// The number of cubes to render in the simulation (try values between 2 and about 50)
#define CUBECOUNT 5
neRigidBody *gCubes[CUBECOUNT];
neAnimatedBody *gFloor = NULL;


bool GLWidget::InitPhysics(void)
{
  neGeometry *geom;    // A Geometry object which used to define the shape/size of each cube
    neV3 boxSize1;       // A variable to store the length, width and height of the cube
    neV3 gravity;        // A vector to store the direction and intensity of gravity
    neV3 pos;            // The position of a cube
    f32 mass;            // The mass of our cubes
    neSimulatorSizeInfo sizeInfo;    // Stores data about how many objects we are going to model
    int i;

    // Create and initialise the simulator
    // Tell the simulator how many rigid bodies we have
    sizeInfo.rigidBodiesCount = CUBECOUNT;
    // Tell the simulator how many animated bodies we have
    sizeInfo.animatedBodiesCount = 1;
    // Tell the simulator how many bodies we have in total
    s32 totalBody = sizeInfo.rigidBodiesCount + sizeInfo.animatedBodiesCount;
    sizeInfo.geometriesCount = totalBody;
    // The overlapped pairs count defines how many bodies it is possible to be in collision
    // at a single time. The SDK states this should be calculated as:
    //   bodies * (bodies-1) / 2
    // So we'll take its word for it. :-)
    sizeInfo.overlappedPairsCount = totalBody * (totalBody - 1) / 2;
    // We're not using any of these so set them all to zero
    sizeInfo.rigidParticleCount = 0;
    sizeInfo.constraintsCount = 0;
    sizeInfo.terrainNodesStartCount = 0;


    // Set the gravity. Try changing this to see the effect on the objects
    gravity.Set(0.0f, -10.0f, 0.0f);
    qDebug() << sizeInfo.rigidBodiesCount ;
    // Ready to go, create the simulator object
   
    gSim = neSimulator::CreateSimulator(sizeInfo, NULL, &gravity);

[...]

Hier kommt jetzt die Warnung
undefined reference to `neSimulator::CreateSimulator(neSimulatorSizeInfo const&, neAllocatorAbstract*, neV3 const*)'
und der Fehler:
error: collect2: ld returned 1 exit status
Ich weiß jetzt nicht ob ich etwas beim Einrichten von Tokamak falsch gemacht habe, oder was anderes.. auf jeden Fall kann er die Zeile
gSim = neSimulator::CreateSimulator(sizeInfo, NULL, &gravity);
nicht ausführen.

Kann mir jemand weiterhelfen?

Vielen Dank,
streikbrecher

Verfasst: 28. Juli 2009 19:58
von Christian81
#pragma comment(lib, "tokamak.lib")
Das ist definitiv keine Anweisung die irgendwer außer de MS-Compiler versteht... also linke richtig gegen die Libs anstatt diesen nicht-Standardbefehl zu verwenden

Verfasst: 28. Juli 2009 20:18
von -=Freaky=-
Christian81 hat geschrieben:
#pragma comment(lib, "tokamak.lib")
Das ist definitiv keine Anweisung die irgendwer außer de MS-Compiler versteht... also linke richtig gegen die Libs anstatt diesen nicht-Standardbefehl zu verwenden
stimmt genau.

allerdings:
[klugschiss]das pragma-zeugs, also auch linken, wird iirc auch vom borland z.t. supportet.[/klugschiss] ;)

mfg,
julian

Verfasst: 28. Juli 2009 21:01
von streikbrecher
Danke für die Antworten.
also linke richtig gegen die Libs
Sorry, ich kenn' mich noch sehr wenig mit der Einbindung von Bibliotheken in Qt aus. Wie gehe ich da vor? ich hab eine tokamak.lib, eine tokamak_d.lib und den tokamak.h ..

Verfasst: 28. Juli 2009 21:59
von -=Freaky=-
http://doc.qtsoftware.com/4.5/qmake-var ... .html#libs
damit, dann qmake neu ausfuehren.

und den header inkludieren natuerlich.

mfg,
julian

Verfasst: 29. Juli 2009 01:41
von streikbrecher
Ok, die libs sind im lib-Ordner von Qt und in der .pro sind sie drin mit:

Code: Alles auswählen

LIBS += tokamak.lib \
    tokamak_d.lib
tokamak.h ist auch inkludiert, und ich bekomme immernoch die Fehler.

Hier mal der compile-output:
Running build steps for project 3dFoundation...
Creating gdb macros library...
Configuration unchanged, skipping QMake step.
Starting: C:/Entwicklung/Qt/2009.01/mingw/bin/mingw32-make.exe release -w
mingw32-make: Entering directory `C:/Entwicklung/Qt/EigeneProjekte/3dFoundation/3dFoundation'
C:/Entwicklung/Qt/2009.01/mingw/bin/mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory `C:/Entwicklung/Qt/EigeneProjekte/3dFoundation/3dFoundation'
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows -o release\3dFoundation.exe release/main.o release/mainwindow.o release/glwidget.o release/moc_mainwindow.o release/moc_glwidget.o -L"c:\Entwicklung\Qt\2009.01\qt\lib" -lopengl32 -lglu32 -lgdi32 -luser32 -lmingw32 -lqtmain tokamak.lib tokamak_d.lib -lQtOpenGL4 -lQtGui4 -lQtCore4
mingw32-make[1]: Leaving directory `C:/Entwicklung/Qt/EigeneProjekte/3dFoundation/3dFoundation'
mingw32-make: Leaving directory `C:/Entwicklung/Qt/EigeneProjekte/3dFoundation/3dFoundation'
release/glwidget.o:glwidget.cpp:(.text+0x28f): undefined reference to `neSimulator::CreateSimulator(neSimulatorSizeInfo const&, neAllocatorAbstract*, neV3 const*)'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\3dFoundation.exe] Error 1
mingw32-make: *** [release] Error 2
Exited with code 2.
Error while building project 3dFoundation
When executing build step 'Make'

Verfasst: 29. Juli 2009 06:29
von Christian81
Du versuchst eine MSVC-Library (und dann auch noch die gleiche Library in zwei verschiedenen Ausführungen) gegen ein MinGW-Executable zu linken. Das kann genauso wenig gehen.

Verfasst: 29. Juli 2009 12:39
von streikbrecher
Woran erkennt man denn, ob eine .lib eine MSVC-Library ist? Ich habe jetzt angenommen, dass sowas Unabhängig von der IDE oder vom Compiler ist..

Die Version die ich bis jetzt verwendet hab, ist aus dem Tutorial. Es gibt auch noch ein SDK mit folgenden Dateien:
  • tokamakdll.dll
    tokamakdll.lib
    tokamak_md.lib
    tokamak_m.lib
    tokamak_d.lib
    tokamak.lib
plus die header..

Bringt mir die .dll vielleicht was?

Danke für die bisherigen Antworten,

streikbrecher
[/quote][/code]

Verfasst: 29. Juli 2009 12:56
von solarix
Woran erkennt man denn, ob eine .lib eine MSVC-Library ist?
Also meine mingw-Umgebung erzeugt keine lib-Dateien.. Das Qt-Template "lib" erzeugt bei mir gleich dlls. IMHO ist *.lib also immer MSVC..
Ich habe jetzt angenommen, dass sowas Unabhngig von der IDE oder vom Compiler ist..
C-ABI ist genormt, C++ hingegen nicht .. siehe http://en.wikipedia.org/wiki/Name_mangling
Bringt mir die .dll vielleicht was?
Die Lib-Datei ist ja nur ein Interface zur dll... daher: falscher Compiler ist falscher Compiler.. du musst das ganze Projekt (inkl. Fremdlibrary) mit _einem_ Compiler uebersetzen.

Verfasst: 29. Juli 2009 14:43
von -=Freaky=-
ich hab mal was von einem tool gelesen, mit dem man (zumindest einige) lib-files entsprechend konvertieren koennen soll.
hies iirc reimp, ich glaub das gabs mit den mingw-utils, google doch mal.

mfg,
julian

Verfasst: 29. Juli 2009 15:52
von streikbrecher
Hab in anderen Beiträgen auch den Vorschlag mit reimp gesehen.
'reimp tokamak.lib' spuckt mir eine Sammlung von .obj-dateien aus, in einem Sinne wohl Unterkategorien der Library:
  • boxcylinder.obj
    collision.obj
    collisionbody.obj
    ...
Damit kann ich jetzt nix anfangen..

Wenn ich wie hier beschrieben mit den mingw-tools (über pexport (.def) und tokamak.dll) eine .a-datei erstelle, wie muss ich die dann weiterverwenden?
Mein erster naiver Ansatz mit LIBS += tokamak.a war natürlich zum scheitern verurteilt.

Verfasst: 29. Juli 2009 16:35
von Christian81
Wie oft denn noch? Man kann keine C++-Library verschiedener Hersteller mixen!