We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
i have defined an array in header file "Variables.h" and include it to source files. extern char LCD[11] = {0xF6, 0xC0, 0x6E, 0xEA, 0xD8, 0xBA, 0xBE, 0xE0, 0xFE, 0xFA, 0x00};
when am trying to compile i get the next message:
Build target 'Target 1' assembling LPC2300.s... compiling Main.c... compiling Interrupts.c... compiling Init.c... compiling LCD_ML1001.c... linking... Second Counter + TI8148.axf: Error: L6200E: Symbol LCD multiply defined (by interrupts.o and main.o). Second Counter + TI8148.axf: Error: L6200E: Symbol LCD multiply defined (by init.o and main.o). Second Counter + TI8148.axf: Error: L6200E: Symbol LCD multiply defined (by lcd_ml1001.o and main.o). Second Counter + TI8148.axf: Not enough information to list image symbols. Second Counter + TI8148.axf: Not enough information to list the image map. Second Counter + TI8148.axf: Finished: 2 information, 0 warning and 3 error messages. Target not created
"To me, ... is special ..."
How does their "specialness" for that architecture differ from the "specialness" offered by this forum vendors' features supporting the roughly equivalent 8051 architecture and toolchain?
That is asked rhetorically, of course, because then:
To you, the C51 C Compiler is special, mainly because the traditional 8051 MCU is C unfriendly.
like:
Please read the manual
Please read the manual: Read The equivalent Fine Manual.
Get a clue, dude. We choose Keil and HI-TECH toolchains above all others for their respective target architectures because they offer the best performance while also being the most compliant with the language standard. So as to not discourage discussion, I would be most interested to learn from news of industry developments to the contrary.
My development experience is very limited. So I incorrectly assume that most architectures and tool-chains are C friendly. Sorry for that.
Get a clue, dude.
*** henry, why are you always a ***?
We choose Keil and HI-TECH toolchains above all others for their respective target architectures because they offer the best performance while also being the most compliant with the language standard.
Speak for yourself, ***.
I have a copy of HI-TECH compiler because it was given to me for free. Otherwise, it would have been too expensive at any price.
Sorry for that.
Do not worry. *** is just being ***.
'C' itself copes with multiple definitions of an object in a single compilation unit - see "tentative definitions".
No, as a matter of fact, it doesn't. The whole business about tentative definitions exists so there will not be multiple definitions of the the same object, even in a single translation unit. This is achieved by specifying that something like
int foo;
is not, in and of itself, a bona fide definition. It's a declaration that may turn into a definition under certain conditions, to be resolved as the compilers proceeds with its work on the module. That's why it's called a tentative, i.e. a "may-be" definition. You can have multiple instance of that line in a single source file, and only one of them will actually be a definition. The others silently demote into declarations.
Even inside a single source file you can't have multiple actual definitions.
int foo=1; int foo=1;
This is not allowed to compile without complaint.
There is a common extension in this area where the tentative definition mechanism is widened from individual translation units to the whole program. I.e. tool chains supporting this extension (in the setting you're using) will merge multiple tentative-turned-actual definition into a single object at link time. But they won't do it for initialized definitions.