Sign in to follow this  

Vertex declarations give linkage errors

This topic is 2051 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm not sure if this is the right forum category for this(since linkage errors aren't only for DirectX)

The problem is,in my vertex declaration header:
[CODE]
#pragma once
#include <d3dx9.h>
void InitAllVertexDeclarations();
void DestroyAllVertexDeclarations();
struct VertexPos
{
VertexPos():pos(0.0f, 0.0f, 0.0f){}
VertexPos(float x, float y, float z):pos(x,y,z){}
VertexPos(const D3DXVECTOR3& v):pos(v){}
D3DXVECTOR3 pos;
static IDirect3DVertexDeclaration9* Decl;
};
struct VertexCol
{
VertexCol():pos(0.0f, 0.0f, 0.0f),col(0x00000000){}
VertexCol(float x, float y, float z, D3DCOLOR c):pos(x,y,z), col(c){}
VertexCol(const D3DXVECTOR3& v, D3DCOLOR c):pos(v),col(c){}
D3DXVECTOR3 pos;
D3DCOLOR col;
static IDirect3DVertexDeclaration9* Decl;
};
struct VertexPN
{
VertexPN()
:pos(0.0f, 0.0f, 0.0f),
normal(0.0f, 0.0f, 0.0f){}
VertexPN(float x, float y, float z,
float nx, float ny, float nz):pos(x,y,z), normal(nx,ny,nz){}
VertexPN(const D3DXVECTOR3& v, const D3DXVECTOR3& n)
:pos(v),normal(n){}
D3DXVECTOR3 pos;
D3DXVECTOR3 normal;
static IDirect3DVertexDeclaration9* Decl;
};
struct VertexPNT
{
VertexPNT()
:pos(0.0f, 0.0f, 0.0f),
normal(0.0f, 0.0f, 0.0f),
tex0(0.0f, 0.0f){}
VertexPNT(float x, float y, float z,
float nx, float ny, float nz,
float u, float v):pos(x,y,z), normal(nx,ny,nz), tex0(u,v){}
VertexPNT(const D3DXVECTOR3& v, const D3DXVECTOR3& n, const D3DXVECTOR2& uv)
:pos(v),normal(n), tex0(uv){}
D3DXVECTOR3 pos;
D3DXVECTOR3 normal;
D3DXVECTOR2 tex0;
static IDirect3DVertexDeclaration9* Decl;
};
IDirect3DVertexDeclaration9* VertexPos::Decl = 0;
IDirect3DVertexDeclaration9* VertexCol::Decl = 0;
IDirect3DVertexDeclaration9* VertexPN::Decl = 0;
IDirect3DVertexDeclaration9* VertexPNT::Decl = 0;
[/CODE]

i have used

[CODE]
IDirect3DVertexDeclaration9* VertexPos::Decl = 0;
IDirect3DVertexDeclaration9* VertexCol::Decl = 0;
IDirect3DVertexDeclaration9* VertexPN::Decl = 0;
IDirect3DVertexDeclaration9* VertexPNT::Decl = 0;
[/CODE] and then the header is used by the Terrain header,which in turn is used by the Camera header.Now i checked all other possibilities,there is no other place where this problem could originate.The problem is IntelliSense says all these structs are alredy defined in the .obj-s where ''Vertex.h'' is used:

[attachment=8685:error.png]

Share this post


Link to post
Share on other sites
[code]
IDirect3DVertexDeclaration9* VertexPos::Decl = 0;
IDirect3DVertexDeclaration9* VertexCol::Decl = 0;
IDirect3DVertexDeclaration9* VertexPN::Decl = 0;
IDirect3DVertexDeclaration9* VertexPNT::Decl = 0;
[/code]

You can't define static variables like this in a header file, otherwise they will get defined in every translation unit that includes the header (which is why you get the "already defined error"). You need to define them in a cpp file.

Share this post


Link to post
Share on other sites

This topic is 2051 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this