Is "undefined reference" the same as "unresolved external symbol"?
Jonathan Wakely
jwakely.gcc@gmail.com
Sat Jan 17 00:46:00 GMT 2015
On 16 January 2015 at 19:50, emkessler wrote:
> Bernd Jendrissek-2 wrote
>> On Thu, Jan 15, 2015 at 2:11 AM, emkessler <
>
>> ldgn86a@
>
>> > wrote:
>> (2) How can that happen when the symbol is obviously defined?
>>
>> It could happen if both source files are compiled into libraries, and
>> the library order doesn't allow one to see definitions in the other.
>> On Unixy platforms, libraries don't see "backward" up the link line.
>> For example, if your final link is something like
>>
>> gcc program.o -lmap -lunits
>>
>> then if your variable is defined in libmap, and libunits uses it, it
>> can't resolve the reference. To fix this sort of problem, invert the
>> order or libraries, or if it's a circular dependency, repeat the
>> earlier library after the one that uses symbols defined in it. In my
>> example, program.o can use any symbols defined in libmap or libunits,
>> and libmap can use any symbols in libunits, but libunits canot use
>> symbols from libmap.
>
> They're not in different libraries, but they are in different object files,
> so I tried rearranging the order of the object files in the final link. Now
> I get the following error:
>
> FluxWarrior2D.o:FluxWarrior2D.cpp:(.text+0x0): multiple definition of
> `WriteToLogFile(wchar_t const*)@4'
> FluxWarrior2D.o:FluxWarrior2D.cpp:(.text+0x0): first defined here
>
> FluxWarrior2D.o is the first object file in the link order. In the source
> code, WriteToLogFile() is only defined once. This error occurs perhaps
> fifty or a hundred times (I didn't count) for every global function, I
> believe. For example:
>
> FluxWarrior2D.o:FluxWarrior2D.cpp:(.text+0x27f): multiple definition of
> `WinMain(HINSTANCE__*, HINSTANCE__*, wchar_t*, int)@16'
> FluxWarrior2D.o:FluxWarrior2D.cpp:(.text+0x27f): first defined here
> FluxWarrior2D.o:FluxWarrior2D.cpp:(.text+0x79f): multiple definition of
> `MyRegisterClass(HINSTANCE__*)'
> FluxWarrior2D.o:FluxWarrior2D.cpp:(.text+0x79f): first defined here
> FluxWarrior2D.o:FluxWarrior2D.cpp:(.text+0x83c): multiple definition of
> `InitInstance(HINSTANCE__*, CFluxWar2DScene*, CFluxWar2DView*&, int)'
> FluxWarrior2D.o:FluxWarrior2D.cpp:(.text+0x83c): first defined here
>
> In each case the "multiple definition" has the same address as the "first
> defined here." On the face of it this makes no sense, but there is probably
> a simple fix. What can I do here to fix this?
It usually means you've named the file twice on the command line, or
when the definition comes from a header it implies you didn't put
"inline" on the function.
Please show the full command lines you're using, so we don't have to
guess what you're attempting.
More information about the Gcc-help
mailing list