Last update March 7, 2012

Error Messages /
Linker Errors



Table of contents of this page
Error 42: Symbol Undefined   
You neglected to provide the linker with a needed binary file.   
You're using a old .lib file (created from a .dll) that's missing some definitions   
You're using a library that suffers from OPTLINK's template linking bug.   
You do not define the destructor, only give a prototype.   

Error 42: Symbol Undefined    

Many things could have caused this problem, but here are a few reasons and suggestion solutions. (This list is incomplete.)

You neglected to provide the linker with a needed binary file.    

Example:

Command line:

dmd month.d

Linker output:

month.obj(month)
Error 42: Symbol Undefined _D3jic6CallMeFAaZAa
month.obj(month)
Error 42: Symbol Undefined _D3jic9CallMeTooFAaZAa
--- errorlevel 2

Possible problem: The linker don't know where jic.obj is (note the jic in _D3jic6CallMeFAaZa and _D3jic9CallMeTooFAaZAa).

Solution: Add jic.obj or jic.d when invoking the compiler.

Try this

dmd jic.d
dmd month.d jic.obj
or this
dmd month.d jic.d

For a more detailed example: DsourceTopic:630

You're using a old .lib file (created from a .dll) that's missing some definitions    

The Win32 libraries distributed with D are very old, from 1995-1996, so anything introduced in Windows 98 and upwards won't be available.

You can either call functions at runtime with GetProcAddress, or link them in at compile time. To do the latter, you need to create a new library file defining the function you wish to import, like so:

1) Create a new text file, called "user32ex.def", with the following content:

LIBRARY user32
EXPORTS
2) Now list all the functions the linker says are undefined, eg
_GetWindowInfo@8 = GetWindowInfo
3) Go to DigitalMars:download/freecompiler.html and download the free "Basic Utilities" package, and unzip to c:\dm\bin or wherever your dm\bin directory is located. Then at the command line, cd to the directory you created the user32ex.def file (usually c:\dm\lib) and enter this:
c:\dm\bin\implib user32ex.lib user32ex.def
4) Add user32ex.lib to your dmd command line when compiling

(source: NG:digitalmars.D.learn/1781)

Another way to fix this particular problem is to create an alternative .lib file with implib and a better .def file, such as one of those available at DsourceProject:bindings/wiki/DefFiles ( NG:digitalmars.D.learn/1786).

Yet another approach is to try using the linkdef tool on the .dll: http://www.dprogramming.com/linkdef.php.

Another tool (called "coffimplib") seems like a more direct approach. See NG:digitalmars.D.announce/2405.

You're using a library that suffers from OPTLINK's template linking bug.    

See "Template Linker Problem" at DocComments/Template for an example and some suggestions.

You do not define the destructor, only give a prototype.    

Example:

class myClass {
  ~this();  // Should have a body! Like: ~this(){}
            // Remove it!
}


FrontPage | News | TestPage | MessageBoard | Search | Contributors | Folders | Index | Help | Preferences | Edit

Edit text of this page (date of last change: March 7, 2012 20:38 (diff))