nopnop2002 / Raspberry-ili9325

Parallel TFT Shield Library for wiringPi
64 stars 14 forks source link

Avoid of multiple definition errors #41

Closed uncleura closed 2 years ago

uncleura commented 2 years ago

We do #include tftlib.h throughout the program, and the tft.h file has its own protection against multiple inclusion: #ifndef \_TFT_LIB_H__ . However, this protection fails when we first include the tft_lib.h file when building the driver.a library and then try to build the main program that also #includes tft_lib.h along with the library driver.a . Global vars (DrawPixel ... InversionOn) which we declare in this tft_lib.h file should be declared only once as "global vars" . And additionally we can include them as =external= variables in as many files as we want. The .c file name, consonant with the name of the tft_lib.h, I mean tft_lib.c, suggests that for any set of modules in the final program, where the tft_lib.h file is included, this set will always have the tft_lib.c module. So, we do declare global vars when we include tht_lib.h to tft_lib.c and do extern vars declarations when we include tft_lib.h to other .c files.

nopnop2002 commented 2 years ago

No error in my environment.

You are doing something wrong.

pi@raspberrypi:~ $ cd Raspberry-ili9325/
pi@raspberrypi:~/Raspberry-ili9325 $ make ILI9341
cc    -c -o driver/st7781.o driver/st7781.c
cc    -c -o driver/ili9342.o driver/ili9342.c
cc    -c -o driver/ili9488.o driver/ili9488.c
cc    -c -o driver/ili9327.o driver/ili9327.c
cc    -c -o driver/ili9486.o driver/ili9486.c
cc    -c -o driver/ili9481.o driver/ili9481.c
cc    -c -o driver/s6d1121.o driver/s6d1121.c
cc    -c -o driver/ili9225.o driver/ili9225.c
cc    -c -o driver/ili9341.o driver/ili9341.c
cc    -c -o driver/ili9325.o driver/ili9325.c
cc    -c -o driver/lgdp4532.o driver/lgdp4532.c
cc    -c -o driver/ili9320.o driver/ili9320.c
cc    -c -o driver/r61509.o driver/r61509.c
ar crv driver.a driver/st7781.o driver/ili9342.o driver/ili9488.o driver/ili9327.o driver/ili9486.o driver/ili9481.o driver/s6d1121.o driver/ili9225.o driver/ili9341.o driver/ili9325.o driver/lgdp4532.o driver/ili9320.o driver/r61509.o
a - driver/st7781.o
a - driver/ili9342.o
a - driver/ili9488.o
a - driver/ili9327.o
a - driver/ili9486.o
a - driver/ili9481.o
a - driver/s6d1121.o
a - driver/ili9225.o
a - driver/ili9341.o
a - driver/ili9325.o
a - driver/lgdp4532.o
a - driver/ili9320.o
a - driver/r61509.o
driver.a make success
cc    -c -o tjpgd2/decode_jpeg.o tjpgd2/decode_jpeg.c
cc    -c -o tjpgd2/tjpgd.o tjpgd2/tjpgd.c
ar crv jpeg.a tjpgd2/decode_jpeg.o tjpgd2/tjpgd.o
a - tjpgd2/decode_jpeg.o
a - tjpgd2/tjpgd.o
jpeg.a make success
cc    -c -o pngle/pngle.o pngle/pngle.c
cc    -c -o pngle/decode_png.o pngle/decode_png.c
cc    -c -o pngle/miniz.o pngle/miniz.c
ar crv png.a pngle/pngle.o pngle/decode_png.o pngle/miniz.o
a - pngle/pngle.o
a - pngle/decode_png.o
a - pngle/miniz.o
png.a make success
cc -o demo demo.c fontx.c tft_lib.c driver.a jpeg.a png.a -lwiringPi -lm -lpthread -DILI9341
cc -o draw draw.c fontx.c tft_lib.c driver.a jpeg.a png.a -lwiringPi -lm -lpthread -DILI9341
cc -o rgb2color rgb2color.c
cc -o jpegtest jpegtest.c fontx.c tft_lib.c driver.a jpeg.a png.a -lwiringPi -lm -lpthread -DILI9341
cc -o pngtest pngtest.c fontx.c tft_lib.c driver.a jpeg.a png.a -lwiringPi -lm -lpthread -DILI9341
pi@raspberrypi:~/Raspberry-ili9325 $
uncleura commented 2 years ago

No, i don't think so. Look, up to "png.a make success" message I got the same, but when demo.c start to compiling, I receive errors: $ make ILI9341 cc -c -o driver/ili9225.o driver/ili9225.c cc -c -o driver/ili9320.o driver/ili9320.c cc -c -o driver/ili9325.o driver/ili9325.c cc -c -o driver/ili9327.o driver/ili9327.c cc -c -o driver/ili9341.o driver/ili9341.c cc -c -o driver/ili9342.o driver/ili9342.c cc -c -o driver/ili9481.o driver/ili9481.c cc -c -o driver/ili9486.o driver/ili9486.c cc -c -o driver/ili9488.o driver/ili9488.c cc -c -o driver/lgdp4532.o driver/lgdp4532.c cc -c -o driver/r61509.o driver/r61509.c cc -c -o driver/s6d1121.o driver/s6d1121.c cc -c -o driver/st7781.o driver/st7781.c ar crv driver.a driver/ili9225.o driver/ili9320.o driver/ili9325.o driver/ili9327.o driver/ili9341.o driver/ili9342.o driver/ili9481.o driver/ili9486.o driver/ili9488.o driver/lgdp4532.o driver/r61509.o driver/s6d1121.o driver/st7781.o r - driver/ili9225.o r - driver/ili9320.o r - driver/ili9325.o r - driver/ili9327.o r - driver/ili9341.o r - driver/ili9342.o r - driver/ili9481.o r - driver/ili9486.o r - driver/ili9488.o r - driver/lgdp4532.o r - driver/r61509.o r - driver/s6d1121.o r - driver/st7781.o driver.a make success cc -c -o tjpgd2/decode_jpeg.o tjpgd2/decode_jpeg.c cc -c -o tjpgd2/tjpgd.o tjpgd2/tjpgd.c ar crv jpeg.a tjpgd2/decode_jpeg.o tjpgd2/tjpgd.o r - tjpgd2/decode_jpeg.o r - tjpgd2/tjpgd.o jpeg.a make success cc -c -o pngle/decode_png.o pngle/decode_png.c cc -c -o pngle/miniz.o pngle/miniz.c cc -c -o pngle/pngle.o pngle/pngle.c ar crv png.a pngle/decode_png.o pngle/miniz.o pngle/pngle.o r - pngle/decode_png.o r - pngle/miniz.o r - pngle/pngle.o png.a make success cc -o demo demo.c fontx.c tft_lib.c driver.a jpeg.a png.a -lwiringPi -lm -lpthread -DILI9341 /usr/bin/ld: /tmp/ccKMi9XL.o:(.bss+0x0): multiple definition of DrawPixel'; /tmp/ccv5daKO.o:(.bss+0x0): first defined here /usr/bin/ld: /tmp/ccKMi9XL.o:(.bss+0x4): multiple definition ofDrawMultiPixels'; /tmp/ccv5daKO.o:(.bss+0x4): first defined here /usr/bin/ld: /tmp/ccKMi9XL.o:(.bss+0x8): multiple definition of DrawFillRect'; /tmp/ccv5daKO.o:(.bss+0x8): first defined here /usr/bin/ld: /tmp/ccKMi9XL.o:(.bss+0xc): multiple definition ofDisplayOff'; /tmp/ccv5daKO.o:(.bss+0xc): first defined here /usr/bin/ld: /tmp/ccKMi9XL.o:(.bss+0x10): multiple definition of DisplayOn'; /tmp/ccv5daKO.o:(.bss+0x10): first defined here /usr/bin/ld: /tmp/ccKMi9XL.o:(.bss+0x14): multiple definition ofInversionOff'; /tmp/ccv5daKO.o:(.bss+0x14): first defined here /usr/bin/ld: /tmp/ccKMi9XL.o:(.bss+0x18): multiple definition of InversionOn'; /tmp/ccv5daKO.o:(.bss+0x18): first defined here /usr/bin/ld: driver.a(ili9341.o):(.bss+0x0): multiple definition ofDrawPixel'; /tmp/ccv5daKO.o:(.bss+0x0): first defined here /usr/bin/ld: driver.a(ili9341.o):(.bss+0x4): multiple definition of DrawMultiPixels'; /tmp/ccv5daKO.o:(.bss+0x4): first defined here /usr/bin/ld: driver.a(ili9341.o):(.bss+0x8): multiple definition ofDrawFillRect'; /tmp/ccv5daKO.o:(.bss+0x8): first defined here /usr/bin/ld: driver.a(ili9341.o):(.bss+0xc): multiple definition of DisplayOff'; /tmp/ccv5daKO.o:(.bss+0xc): first defined here /usr/bin/ld: driver.a(ili9341.o):(.bss+0x10): multiple definition ofDisplayOn'; /tmp/ccv5daKO.o:(.bss+0x10): first defined here /usr/bin/ld: driver.a(ili9341.o):(.bss+0x14): multiple definition of InversionOff'; /tmp/ccv5daKO.o:(.bss+0x14): first defined here /usr/bin/ld: driver.a(ili9341.o):(.bss+0x18): multiple definition ofInversionOn'; /tmp/ccv5daKO.o:(.bss+0x18): first defined here collect2: error: ld returned 1 exit status make: *** [Makefile:58: ILI9341] Error 1

nopnop2002 commented 2 years ago

This is my environment. Something is different.

cc -o demo demo.c fontx.c tft_lib.c driver.a jpeg.a png.a -lwiringPi -lm -lpthread -DILI9341
cc -o draw draw.c fontx.c tft_lib.c driver.a jpeg.a png.a -lwiringPi -lm -lpthread -DILI9341
cc -o rgb2color rgb2color.c
cc -o jpegtest jpegtest.c fontx.c tft_lib.c driver.a jpeg.a png.a -lwiringPi -lm -lpthread -DILI9341
cc -o pngtest pngtest.c fontx.c tft_lib.c driver.a jpeg.a png.a -lwiringPi -lm -lpthread -DILI9341

pi@raspberrypi:~/Raspberry-ili9325 $ uname -a
Linux raspberrypi 5.10.103-v7+ #1529 SMP Tue Mar 8 12:21:37 GMT 2022 armv7l GNU/Linux

pi@raspberrypi:~/Raspberry-ili9325 $ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
nopnop2002 commented 2 years ago

The version of GCC has changed. raspberrypi 5.10.103-v7+:gcc (Raspbian 8.3.0-6+rpi1) 8.3.0 raspberrypi 5.15.32-v7+:gcc (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110

"Multiple definition of" on GCC 10.2.1 but not GCC 8.3.0

There was a change in behaviour about global variables between GCC 8.3.0 and GCC 10.2.1. In C you are supposed to only define a global variable in one translation unit, other translation unit that want to access the variable should declare it as "extern".

GCC 8.3.0 has a collaborative definition, so no error occurs. But GCC 10.2.1 don't have cooperative definition, so error occurs.


Thank you for reporting and your code.

Your code has helped me a lot.

Try latest.

uncleura commented 2 years ago

Glad to make my modest contribution. Thank you.