Skocz do zawartości


Zdjęcie

[c++] błąd linkera


  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie

#1 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 25 03 2010 - 13:32

witam,
mam problem z podziałem programy na pliki. robię to pierwszy raz wobec czego proszę o wyrozumiałość.

dla potrzeb tego posta napisałem prościutki programik,ale w innych przypadkach dzieje się to samo.
uprzedzę ze szukałem odpowiedzi w sieci lecz nie znalazłem żadnej która by pomogła.

a wiec do sedna,przy kompilacji dev wyrzuca taki błąd:

In function `main':
[Linker error] undefined reference to `hello(int)'
ld returned 1 exit status


nie wiem czy to coś z kodem czy jak...

oto przykładowy kod przy którym wyskakuje błąd:

plik pro1.cpp:
#include<iostream>
#include "head.hpp"

using namespace std;

int main()
{
  int a;
  cin>>a;
  cout<<hello(a);

  system("pause");
  return 0;
}

plik head.hpp:
#ifndef _head_hpp_
#define _head_hpp_

float hello(int a);

#endif

plik head.cpp:
float hello(int a)
{
  a=a+10;
  return a/1.0;     
}

czy mógłbym liczyć na pomoc w tej kwestii?

  • 0

#2 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 27 03 2010 - 19:11

Hmm... Ja bym się pobawiła w ten sposób:

Zamiast pliku hpp powinieneś zrobić head.h
Dołączasz dyrektywe #include "head.h" do pliku "pro1.cpp" oraz "head.cpp" (w tym drugim też musisz dołączyć)

Btw. w pliku head.cpp przy return nie musisz robić dzielenia przez 1.0. Lepiej już, żebyś zrobił:
a=a+10.


Użytkownik Katarina edytował ten post 27 03 2010 - 19:12

  • 0

#3 izaw

izaw

    Początkujący

  • 97 postów

Napisano 27 03 2010 - 19:52

Błędów sporo. Ale ten odnoszący się do tego błędu. Nie kompilujesz pliku head.cpp, nie włączyłeś wszystkich plików do projektu.
  • 0

#4 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 27 03 2010 - 22:31

Hmm... Ja bym się pobawiła w ten sposób:

Zamiast pliku hpp powinieneś zrobić head.h
Dołączasz dyrektywe #include "head.h" do pliku "pro1.cpp" oraz "head.cpp" (w tym drugim też musisz dołączyć)


head.h miałem wcześniej ale zwrócono mi uwagę ze w cpp powinno się korzystać z hpp mimo ze wiele osób i tak korzysta z h,sądze ze większego wpływu to nie ma,po zaincludowaniu head.h/head.hpp w head.cpp nadal się nie kompiluje:(

Btw. w pliku head.cpp przy return nie musisz robić dzielenia przez 1.0. Lepiej już, żebyś zrobił:

a=a+10.

tu akurat wszystko jedno,pisałem szybko cokolwiek,chodziło mi o problem z linkowaniem i kompilacją całości jako takiej,wiec jestem świadom ze kod może być beznadziejny:P

@izaw:
kompiluje to co jest pokazane...o jakich błędach jeszcze mówisz?

-----
może powinienem wspomnieć,ze pliki nie są w projekcie,tylko tworzone osobno,ale taka metoda tez powinna działać. jeśli zrobię nowy projekt i dodam ww pliki i kompiluje projekt,to działa,aczkolwiek dev tworzy mnóstwo niepotrzebnych mi plików. chodzi o to żeby działało bez tworzenia projektu,gdyż taka forma jest ode mnie wymagana.
  • 0

#5 izaw

izaw

    Początkujący

  • 97 postów

Napisano 28 03 2010 - 00:00

Jak kompilujesz podaj metodę, bo każdy mówi o czymś innym. Masz błąd linkera mówiący o braku skompilowanej funkcji hello, a jej kod znajduje się w pliku head.cpp.
  • 0

#6 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 28 03 2010 - 00:39

Jak kompilujesz podaj metodę, bo każdy mówi o czymś innym. Masz błąd linkera mówiący o braku skompilowanej funkcji hello, a jej kod znajduje się w pliku head.cpp.



hmm jestem poczatkujacy i nie do konca znam sie na metodach kopmilacji;
korzystam z domyślnych ustawień dev cpp i po prostu klikam kompiluj w odpowiednim menu...
  • 0

#7 izaw

izaw

    Początkujący

  • 97 postów

Napisano 28 03 2010 - 01:10

Jak nie masz projektu, to kompilujesz tylko aktualny plik. Ty masz projekt wieloplikowy i musisz albo
- utworzyć projekt i wtedy środowisko utworzy zależności i skompiluje potrzebne pliki oraz zlinkuje wyniki,
- napisać plik make robiący powyższe,
- wydać polecenie dla kompilatora z linii poleceń.

W twoim przypadku najłatwiejszym i najsensowniejszym jest pierwsze.

Na marginesie. Środowisko Dev jest od dawna nierozwijane i ma małą funkcjonalność. Jeżeli chcesz uczyć się programowania pod Windows ściągnij i zainstaluj darmowe środowisko Visual Studio 2008 EE. Tutaj masz link http://www.microsoft.com/poland/developer/produkty/vs2008/vs2008expressedition.mspx. Wybierasz Visual C++ 2008 EE i ściągasz instalator. Dalej on ciebie poprowadzi.
  • 0

#8 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 29 03 2010 - 22:26

ok,wielkie dzięki.

btw. czy dużym błędem byłoby zaincludowanie bezpośrednio w pro1.cpp head.cpp zamiast head.h/hpp i całkowite pominiecie tego drugiego?

mam na myśli coś takiego:
#include<iostream>
#include "head.cpp"  <-------

using namespace std;

........

Użytkownik Venom Morph edytował ten post 29 03 2010 - 22:27

  • 0

#9 izaw

izaw

    Początkujący

  • 97 postów

Napisano 29 03 2010 - 23:14

Po to wprowadzono podział plików na nagłówkowe i źródłowe, żeby ten mechanizm stosować.

Możesz po prostu wkleić zawartość head.cpp przed funkcją main. I będziesz mieć jeden plik.

Jeżeli jednak chcesz nauczyć się pisania programów z podziałem na pliki, to niestety musisz trzymać się reguł. I nie chodzi o to czy zadziała, ale o poprawność. Naginając, a właściwie ignorując zasady niczego się nie nauczysz, przeciwnie wyrobisz sobie nawyki które zadziałają tylko w tym kodzie, a w innym już nie.

  • 0

Zobacz więcej tematów z tagiem: język C++



Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych