Skip to main content
Associate
July 25, 2024
Solved

"Multiple definition" Error compilation of typedef on header file

  • July 25, 2024
  • 4 replies
  • 2741 views

Hello, I imported a project on STM32CubeIDE V1.9.

But when i compile, i have many errors (nearly 760) like this :

d:\stm32cubeide_1.9.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.0.202111181127\tools\arm-none-eabi\bin\ld.exe: ./Application ino/Src/ino_1_IO.o:C:/Users/innolife/STM32CubeIDE/workspace_1.9.0/PE30-V_V2.41-K_V2.2/Drivers/AX/Inc/AX_IO.h:21: multiple definition of `Gestion_INPUT'; ./Application ino/Src/ino_0_Application.o:C:/Users/innolife/STM32CubeIDE/workspace_1.9.0/PE30-V_V2.41-K_V2.2/Drivers/AX/Inc/AX_IO.h:21: first defined here

 

The error is on declarations of a typedef or enum on a header files.

Few struct are declared like this :

 

typedef struct

{

                uint8_t OldState_1;

                uint8_t Flag_IN_1;

                uint8_t Flag_OUT_1;

                uint8_t TIMER_1;

                uint8_t OldState_2;

                uint8_t TIMER_2;

                uint8_t OldState_3;

                uint8_t TIMER_3;

                uint8_t OldState_4;

                uint8_t Flag_IN_4;

                uint8_t Flag_OUT_4;

                uint8_t TIMER_4;

}GESTION_IO;

GESTION_IO Gestion_INPUT, Gestion_OUTPUT;

 

the headers files are include in all C file of the software.

 

Have you got an idea to solve my problem?

Thanks in advance for your help

 

    This topic has been closed for replies.
    Best answer by Andrew Neil

    The error is telling you that you have multiple definitions of Gestion_INPUT:

    1. in the file ./Application ino/Src/ino_1_IO.c from the header C:/Users/innolife/STM32CubeIDE/workspace_1.9.0/PE30-V_V2.41-K_V2.2/Drivers/AX/Inc/AX_IO.h at line 21;
    2. in the file ./Application ino/Src/ino_0_Application.c from the header C:/Users/innolife/STM32CubeIDE/workspace_1.9.0/PE30-V_V2.41-K_V2.2/Drivers/AX/Inc/AX_IO.h at line 21

    So it looks like you are defining the variable in you header - don't do that!

    Your header should just contain the extern declaration - the definition should be in a .c file.

     

    EDITs:

    https://community.st.com/t5/stm32cubeide-mcus/build-issue-as-variable-defined-once-more-however-it-is-only/m-p/657254/highlight/true#M25815

    And here's a full example:

    https://community.st.com/t5/stm32cubeide-mcus/adding-new-c-source-files-to-my-project-and-navigating-through/m-p/657455/highlight/true#M25847

     

    Further edit:


    @st_user wrote:

    The error is on declarations of a typedef or enum on a header files.


    No. The error is on the definition of the variable - Gestion_INPUT - not the definition of the typedef.

    This is the typedef definition:

     

    typedef struct
    {
     uint8_t OldState_1;
     uint8_t Flag_IN_1;
     uint8_t Flag_OUT_1;
     uint8_t TIMER_1;
     uint8_t OldState_2;
     uint8_t TIMER_2;
     uint8_t OldState_3;
     uint8_t TIMER_3;
     uint8_t OldState_4;
     uint8_t Flag_IN_4;
     uint8_t Flag_OUT_4;
     uint8_t TIMER_4;
    } GESTION_IO;

     

    That should stay in the header.

    This is the definition of the variable (actually, two variables) of that type:

     

    GESTION_IO Gestion_INPUT, Gestion_OUTPUT;

     

    That should not be in the header.

    The header should have just the extern declaration:

     

    extern GESTION_IO Gestion_INPUT, Gestion_OUTPUT;

     

     

    The definition should be in one - and only one - .c file.

     

    For how to properly post source code (as above) see:

    https://community.st.com/t5/community-guidelines/how-to-write-your-question-to-maximize-your-chances-to-find-a/ta-p/575228

    4 replies

    Andrew Neil
    Andrew NeilBest answer
    Super User
    July 25, 2024

    The error is telling you that you have multiple definitions of Gestion_INPUT:

    1. in the file ./Application ino/Src/ino_1_IO.c from the header C:/Users/innolife/STM32CubeIDE/workspace_1.9.0/PE30-V_V2.41-K_V2.2/Drivers/AX/Inc/AX_IO.h at line 21;
    2. in the file ./Application ino/Src/ino_0_Application.c from the header C:/Users/innolife/STM32CubeIDE/workspace_1.9.0/PE30-V_V2.41-K_V2.2/Drivers/AX/Inc/AX_IO.h at line 21

    So it looks like you are defining the variable in you header - don't do that!

    Your header should just contain the extern declaration - the definition should be in a .c file.

     

    EDITs:

    https://community.st.com/t5/stm32cubeide-mcus/build-issue-as-variable-defined-once-more-however-it-is-only/m-p/657254/highlight/true#M25815

    And here's a full example:

    https://community.st.com/t5/stm32cubeide-mcus/adding-new-c-source-files-to-my-project-and-navigating-through/m-p/657455/highlight/true#M25847

     

    Further edit:


    @st_user wrote:

    The error is on declarations of a typedef or enum on a header files.


    No. The error is on the definition of the variable - Gestion_INPUT - not the definition of the typedef.

    This is the typedef definition:

     

    typedef struct
    {
     uint8_t OldState_1;
     uint8_t Flag_IN_1;
     uint8_t Flag_OUT_1;
     uint8_t TIMER_1;
     uint8_t OldState_2;
     uint8_t TIMER_2;
     uint8_t OldState_3;
     uint8_t TIMER_3;
     uint8_t OldState_4;
     uint8_t Flag_IN_4;
     uint8_t Flag_OUT_4;
     uint8_t TIMER_4;
    } GESTION_IO;

     

    That should stay in the header.

    This is the definition of the variable (actually, two variables) of that type:

     

    GESTION_IO Gestion_INPUT, Gestion_OUTPUT;

     

    That should not be in the header.

    The header should have just the extern declaration:

     

    extern GESTION_IO Gestion_INPUT, Gestion_OUTPUT;

     

     

    The definition should be in one - and only one - .c file.

     

    For how to properly post source code (as above) see:

    https://community.st.com/t5/community-guidelines/how-to-write-your-question-to-maximize-your-chances-to-find-a/ta-p/575228

    A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
    Tesla DeLorean
    Guru
    July 25, 2024

    Perhaps stop defining things everywhere? That'd help a lot..

    extern GESTION_IO Gestion_INPUT, Gestion_OUTPUT; // In the INCLUDE file

     

    GESTION_IO Gestion_INPUT, Gestion_OUTPUT; // In ONE SOURCE FILE

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    Andrew Neil
    Super User
    July 25, 2024

    @st_user wrote:

    the headers files are include in all C file of the software.


    Think about it: if the header file contains the definition, then including that header file in multiple C files means that you are bound to have multiple definitions in the project!

    A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
    st_userAuthor
    Associate
    August 2, 2024

    Thanks for replies.

    We have done your solution and it's work.