linker: undefined symbol when an interface is derived from.

Jarrett Billingsley kb3ctd2 at yahoo.com
Mon Feb 26 20:35:58 PST 2007


"Neal Alexander" <wqeqweuqy at hotmail.com> wrote in message 
news:es053h$19iq$1 at digitalmars.com...
>
> Yea, file2 is some other code that isn't hugely relevant.

Well, the error is referring to file2.d, so my guess is that the problem is 
there.  Would help if I knew what was in it.

> Anyway, I tried compiling d3d8.d in with it, but it gives 'multiple 
> defined' type errors during the parsing stage since the module is imported 
> i guess (cant build without the type definitions in it).

This is because you've named the file d3d8.d, but the module statement at 
the top says "module directx".  If you put different things for the filename 
and for the module declaration, weird things result, so that should read 
"module d3d8" instead.

> d3d8.d is just a "header" anyway it shouldn't need to be explicitly 
> compiled right? Also, i don't understand why an interface definition 
> produces a symbol in the binary haha.

I think you do need to compile it, because even though IDirect3D8 is just an 
interface, it's a different kind of interface, a COM interface.  COM 
interfaces don't work quite the same way as D interfaces.  When you derive a 
D class from a COM interface, D seems to create a "shim" interface so that 
the class can implement the interface, and that shim is what's actually 
being inserted into the symbol table, and is what D needs.

In fact, I just worked up a simple example just now, and this seems to be 
exactly what's happening:

[-------------dtest.d--------------]
module dtest;

import comtest;
import std.c.windows.com;

pragma(lib, "uuid.lib");

class Foo : ComObject, IFoo
{

}

void main()
{

}

[-----------comtest.d--------------]
module comtest;

import std.c.windows.com;

interface IFoo : IUnknown
{

}


Now, when I compile with the command line

dmd dtest.d

I get the error

dtest.obj(dtest)
 Error 42: Symbol Undefined _D7comtest4IFoo11__InterfaceZ

Hm.  So I compile with

dmd dtest.d comtest.d

and it compiles fine. 




More information about the Digitalmars-d-learn mailing list