Skocz do zawartości

[DevCpp] Błąd: "multiple definition of..." :/


UFO

Recommended Posts

Może spotkał się ktoś już z tym błędem i wie co on oznacza? :( .

O ile dobrze rozumiem to oznacza 'wielokrotne definicje ...', ale każda z wymienionych nazw zmiennych lub funkcji znajduje się w osobnych plikach nagłówkowych a w każdym pliku umieciłem linijki:

#ifndef MojaNazwa
#define MojaNazwa

zawartość pliku

#endif

ale nic to nie pomogło 9_9 . I już nie wiem czy to ja coś źle robię czy to edytor się rypnął.

Mój log:

Compiler: Default compiler
Building Makefile: "F:\PłytaNr.6\KodyZrodlowe\My\RAD\Makefile.win"
Executing make...
make.exe -f "F:\PłytaNr.6\KodyZrodlowe\My\RAD\Makefile.win" all
g++.exe main.o CodeEditor.o ToolBar.o StatusBar.o LeftPanel.o MainMenu.o RAD_private.res -o "RAD.exe" -L"C:/Dev-Cpp/lib" -mwindows C:/Dev-Cpp/lib/libcomctl32.a

CodeEditor.o(.bss+0x0):CodeEditor.cpp: multiple definition of `CodeEditor_Handle'
main.o(.bss+0xd0):main.cpp: first defined here
CodeEditor.o(.bss+0x4):CodeEditor.cpp: multiple definition of `CodeEditor_Tab'
main.o(.bss+0xd4):main.cpp: first defined here
CodeEditor.o(.bss+0x20):CodeEditor.cpp: multiple definition of `CodeEditor_ClientRect'
main.o(.bss+0xf0):main.cpp: first defined here
ToolBar.o(.bss+0x0):ToolBar.cpp: multiple definition of `ToolBar_Handle'
main.o(.bss+0x74):main.cpp: first defined here
ToolBar.o(.bss+0x4):ToolBar.cpp: multiple definition of `ToolBar_ImageList'
main.o(.bss+0x78):main.cpp: first defined here
ToolBar.o(.bss+0x20):ToolBar.cpp: multiple definition of `ToolBar_Buttons'
main.o(.bss+0x80):main.cpp: first defined here
StatusBar.o(.bss+0x0):StatusBar.cpp: multiple definition of `StatusBar_Handle'
main.o(.bss+0x70):main.cpp: first defined here
LeftPanel.o(.bss+0x0):LeftPanel.cpp: multiple definition of `LeftPanel_Handle'
main.o(.bss+0x4c):main.cpp: first defined here
LeftPanel.o(.bss+0x4):LeftPanel.cpp: multiple definition of `LeftPanel_TreeView1'
main.o(.bss+0x50):main.cpp: first defined here
LeftPanel.o(.bss+0x8):LeftPanel.cpp: multiple definition of `LeftPanel_Tab'
main.o(.bss+0x54):main.cpp: first defined here
MainMenu.o(.bss+0x0):MainMenu.cpp: multiple definition of `MainMenu_Handle'

main.o(.bss+0x0):main.cpp: first defined here
MainMenu.o(.bss+0x4c):MainMenu.cpp: multiple definition of `CodeEditor_Handle'
main.o(.bss+0xd0):main.cpp: first defined here
MainMenu.o(.bss+0x50):MainMenu.cpp: multiple definition of `CodeEditor_Tab'
main.o(.bss+0xd4):main.cpp: first defined here
MainMenu.o(.bss+0x6c):MainMenu.cpp: multiple definition of `CodeEditor_ClientRect'

main.o(.bss+0xf0):main.cpp: first defined here

MainMenu.o(.bss+0x7c):MainMenu.cpp: multiple definition of `StatusBar_Handle'
main.o(.bss+0x70):main.cpp: first defined here
collect2: ld returned 1 exit status

make.exe: *** [RAD.exe] Error 1

Execution terminated

Link do komentarza
Udostępnij na innych stronach

Z DevCpp nie kożystam jednak wydaje mi się że problem polega na tym iż w pliku nagłówkowyn masz umieszczone deklaracje zmiennych oraz definicje ciał funkcji. Gdy później dany plik nagłówkowy dołączasz w kilku innych plikach projektu to następuje zjawisko podwujnej definicji.
Zasada jest prosta:
NIE WOLNO definiować ciał funkcji w plikach nagłówkowych.
NIE WOLNO umieszczać deklaracji zmiennych w plikach nagłówkowych.
I nic tu nie pomogą dyrektywy #ifndef i #define.
Podobny temat dotyczący jednak visual C++ był już niedawno na tym forum o tu https://www.winapi.org/forum/viewtopic.php?t=725
Jeżeli będziesz miał jeszcze jakieś pytania to wal śmiało.

Link do komentarza
Udostępnij na innych stronach

:D no tak... moja wina

zadeklarowałem w każdym pliku nagłówkowym po jednej zmiennej. Nikt wcześniej mi nie powiedział że nie wolno tego robić, myślałem że jeżeli mogę zadeklarować zmienną w deklaracji klasy to mogę też zadeklarować zmienną globalną :$ .

Szkoda że zdążyłem już wszystko przepisać na Delphi, ale przynajmiej nie ma tam takich ograniczeń.

ps: pytań będzie jeszcze bardzo dużo, ale już nie w tym temacie :D .

Link do komentarza
Udostępnij na innych stronach

Na Delphi się nie znam więc wierze na słowo. Jeżeli chodzi o C++ to zawsze możesz skorzystać ze słowa kluczowego extern które poinformuje kompilator o istnieniu zmiennej zadeklarowanej w innym pliku.
Przykład:

//Plik zmienna.h.

#ifndef ZMIENNA_H
#define ZMIENNA_H

extern int zmienna;

#endif
//Plik zmienna.cpp

#include "zmienna.h"

int zmienna=5;
//Plik main.cpp

#include <iostream>
#include "zmienna.h"

using namespace std;

int main()
{
        cout<<zmienna<<endl;

        system("pause");

        return 0;
}

Myśle że nie ma co wyjaśniać, wszystko powinno być jasne.

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...