Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

llennard

Frischling

  • »llennard« ist der Autor dieses Themas

Beiträge: 74

Wohnort: Kiel

  • Private Nachricht senden

1

08.07.2007, 22:05

Linker Problem mit tbVideo

hallo, alle zusammen!

ich versuche die tbVideo-Klasse gerade in eine statische lib ("dxengine") einzubauen. Das hat so weit auch geklappt, die Library lässt sich auch kompilieren, aber wenn ich jetzt die Klasse in einer Anwendung verwende, gibt es folgende seltsame Linkerfehler:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--------------------Konfiguration: Test - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
Linker-Vorgang läuft...
LIBCMT.lib(dosmap.obj) : error LNK2005: __dosmaperr bereits in LIBCD.lib(dosmap.obj) definiert
LIBCMT.lib(osfinfo.obj) : error LNK2005: __alloc_osfhnd bereits in LIBCD.lib(osfinfo.obj) definiert
LIBCMT.lib(osfinfo.obj) : error LNK2005: __set_osfhnd bereits in LIBCD.lib(osfinfo.obj) definiert
LIBCMT.lib(osfinfo.obj) : error LNK2005: __free_osfhnd bereits in LIBCD.lib(osfinfo.obj) definiert
LIBCMT.lib(osfinfo.obj) : error LNK2005: __get_osfhandle bereits in LIBCD.lib(osfinfo.obj) definiert
LIBCMT.lib(osfinfo.obj) : error LNK2005: __open_osfhandle bereits in LIBCD.lib(osfinfo.obj) definiert
LIBCMT.lib(lseek.obj) : error LNK2005: __lseek bereits in LIBCD.lib(lseek.obj) definiert
LINK : warning LNK4098: Standardbibliothek "LIBCMT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden
dxengined.lib(Video.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual unsigned long __stdcall CBaseFilter::NonDelegatingRelease(void)" (?NonDelegatingRelease@CBaseFilter@@UAGKXZ)
strmbase.lib(wxutil.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __aulldvrm
strmbase.lib(ctlutil.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __ftol2
Debug/Test.exe : fatal error LNK1120: 3 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Test.exe - 11 Fehler, 1 Warnung(en)


Ich habe strmbase.lib und strmiids.lib mit dem projekt gelinkt, aber trotzdem diese fehler.
Was habe ich jetzt falsch gemacht?

Übrigens, ich verwende VC++ 6.0

llennard

Frischling

  • »llennard« ist der Autor dieses Themas

Beiträge: 74

Wohnort: Kiel

  • Private Nachricht senden

2

09.07.2007, 13:25

kann mir den keiner helfen?? auch david nicht, der doch die video-klasse geschrieben hat?

3

09.07.2007, 14:39

n ähnliches Prob hatte ich mal mit Visual C++ 2005. Schon mal alles komplett neu kompiliert, also Projekt und Bibliothek?
Mein Projekt: Rise of the Sylvan

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

09.07.2007, 14:58

Verstehe ich das richtig, dass du versuchst, tbVideo komplett vom Rest der TriBase zu separieren?

llennard

Frischling

  • »llennard« ist der Autor dieses Themas

Beiträge: 74

Wohnort: Kiel

  • Private Nachricht senden

5

10.07.2007, 09:24

@Crash:

Ja, hab ich gemacht, hab sogar mal die standardbibliotheken ignoriert, aber dann gibt das noch mehr fehler (war ja auch zu erwarten...)

@grek40:

Sagen wir, ich will sie in meine eigene engine einbauen, ist aber halt eine statische

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

6

10.07.2007, 15:34

Ich würde vieleicht mal versuchen, erstmal alle TriBase-Klassen zu übernehmen und sie dann "stückchenweise" zu löschen... also immer eine (wo's geht, sonst halt mehrere) löschen und kompilienen. Bis du halt nur noch die tbVideo übrig hast.

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

7

10.07.2007, 15:47

entweder du hast nicht gegen die libs gelinkt, die die klasse braucht (du könntest zur sicherheit einfach mal alle libs einbinden, die auch von der tribase verwendet werden), oder die definitionen sind irgendwo in der tribase, dann benötigt die tbVideo Klasse offenbar noch ein paar andere Dateien aus der Tribase die du gelöscht hast.

llennard

Frischling

  • »llennard« ist der Autor dieses Themas

Beiträge: 74

Wohnort: Kiel

  • Private Nachricht senden

8

11.07.2007, 11:23

@the[V]oid:

Das wäre eine Möglichkeit, allerdings ist die tribase eine dynamische und meine eine statische lib, da muss ich also auf jeden fall ein anderes projekt als das projekt der tribase-engine verwenden

@rewb0rn:

ich habe alle libs eingebunden die die tribase verwendet, ich werd aber mal sehen, ob ich sonst noch etwas vergessen habe, wusste aber trotzdem nicht was das sein soll...

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

9

11.07.2007, 12:40

dann sollten die definitionen irgendwo in der tribase sein und du hast sie fälschlicherweise nicht in dein projekt eingebunden. ansonsten könnte es vielleicht noch sein, dass die versionen der libs und header deiner abhängigkeiten nicht zusammen passen.

llennard

Frischling

  • »llennard« ist der Autor dieses Themas

Beiträge: 74

Wohnort: Kiel

  • Private Nachricht senden

10

17.07.2007, 12:12

ok, entschuldigt, dass das so lange gedauert hat, aber ich habe nun endlich (mehr durch Zufall) herausgefunden, wodran es liegt. Also:

Ich habe in meinem Resource-Manager (auch in der engine zusammen mit der videoklasse) eine Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool DxResourceManager::LoadVideo(const char* pcIdentifier, char* pcFilename)
{
    if(find(m_Resources.begin(), m_Resources.end(), pcIdentifier) != m_Resources.end())
        LOG_ERROR("Identifer already used!", 1);

    Resource NewRes;
    NewRes.pcIdentifer = pcIdentifier;
    NewRes.ResType = RESTYPE_USERCLASS;
    NewRes.pVideo = new DxVideo;
    if(NewRes.pVideo->Init(pcFilename))
        LOG_ERROR("Error at loading Video!", 1);

    m_Resources.push_back(NewRes);
    return 0;
}



Die Definition für Resource:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
enum EResType
{
    RESTYPE_TEXTURE,
    RESTYPE_USERCLASS,
};

struct Resource
{
    const char*             pcIdentifer;
    EResType                ResType;

    union
    {
        void*                   pRes;
        PDIRECT3DTEXTURE9       pTex;
        PDIRECT3DCUBETEXTURE9   pCubeTex;
        PDIRECT3DVOLUMETEXTURE9 pVolumeTex;
        DxEffect*               pEffect;
        DxMesh*                 pMesh;
        DxSound*                pSound;
        DxMusic*                pMusic;
        DxVideo*                pVideo;
    };

    inline bool operator==(const char* _pcIdentifer) { return _pcIdentifer == pcIdentifer; }
};


So, nun zu dem Problem. Wenn ich die Funktionsdefinition auskommentiere dann gibt es keine Linkerfehler mehr, andernfalls sagt mir der Linker folgendes:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
Linker-Vorgang läuft...
dxengine.lib(Video.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual class CBasePin * __thiscall CAsyncReader::GetPin(int)" (?GetPin@CAsyncReader@@UAEPAVCBasePin@@H@Z)
dxengine.lib(Video.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual int __thiscall CAsyncReader::GetPinCount(void)" (?GetPinCount@CAsyncReader@@UAEHXZ)
dxengine.lib(Video.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual __thiscall CAsyncReader::~CAsyncReader(void)" (??1CAsyncReader@@UAE@XZ)
dxengine.lib(Video.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall CAsyncReader::CAsyncReader(char *,struct IUnknown *,class CAsyncStream *,long *)" (??0CAsyncReader@@QAE@PADPAUIUnknown@@PAVCAsyncStream@@PAJ@Z)
strmbase.lib(dllsetup.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
strmbase.lib(dllentry.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
strmbase.lib(dllsetup.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "int g_cTemplates" (?g_cTemplates@@3HA)
strmbase.lib(dllentry.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "int g_cTemplates" (?g_cTemplates@@3HA)
Release/Test.exe : fatal error LNK1120: 6 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.


Kann mir jemand erklären, was ich falsch mache?

Werbeanzeige