Funkcja, Undefined reference

0

Mam taki problem. W uproszczeniu: mam funkcję a.

W pliku a.hpp mam taki kod:

#ifndef A_HPP
#define A_HPP
namespace moj_projekt {
	int a();
}
#endif

W pliku a.cpp mam taki kod:

#include "a.hpp"
namespace moj_projekt {
	int a() {
		return 1;
	}
}

W funkcji main mam taki kod:

#include "a.hpp"
using namespace moj_projekt;
int main(int argc, char** argv) {
	 int i = a();
}

Problem polega na tym, że linker w main krzyczy: undefined reference!.
Nie lubię krzyków, więc jak to rozwiązać?

Jeśli będzie trzeba, załączę oryginalny kod, może rzeczywiście przeoczam coś.

0

http://ideone.com/2FPK0G

jak widzisz Twoj kod dziala (w jednym pliku) wiec zobacz czy te Twoje pliki sa dolaczone do projektu.

2

Bo linkując, musisz - jak sama nazwa wskazuje - zlinkowac ze wszystkimi kodami, czyli jesli np uzywasz gcc bedziesz musiał wykonać operacje:

g++ -c a.cpp
g++ -c mojmain.cpp
g++ -o mojprogra,.exe a.o mojmain.o

Oczywiście to tylko schemat, ogolnie warto doac rozne inne przelaczniki, w zaleznosci od potrzeb

0

No tak, tylko problem leży w tym, że ten plik jest dołączony do projektu, który już mi poprawnie zlinkował wszystkie pozostałe pliki .hpp i .cpp, tylko tej funkcji nie może. Nie wiem, czemu akurat tego, wszystkie pozostałe wyglądają podobnie (tylko ta jedna funkcja jest funkcją, pozostałe "obiekty" to struktury i klasy). Linkuję cały projekt automatycznie (F11).

0

albo linkuje plik albo nie linkuje, jezeli piszesz ze linkuje to znaczy ze nie widzi zmian w tym pliku (np nie kompilujesz go w ogole) albo nie linkuje tamtego pliku calkowicie (i wtedy musisz zlinkowac)

0

No i teraz jak to wytłumaczyć: opakowałem tę funkcję w strukturę i wszystko poprawnie się linkuje. Tylko że ja nie chcę struktury (bo nie jest mi potrzebna).

0

Zacznij od stworzenia nowego projektu i dodania do pustego projektu już istniejących źródeł.
Jeżeli to nie pomoże to:

  • podaj nazwę/wersje/itp narzędzia w którym to kompilujesz/linkujesz.
  • podaj krok po kroku co zrobiłeś przy tworzeniu nowego projektu

Bo jak każesz zgadywać to pomyliłeś forum - zgadywanie to na forum wróżbitów.

0

czekaj czekaj... a nie jest czasem tak ze funkcja a() istnieje gdzies w programie? i po prostu podales nie calkowity blad?

Bo skoro w strukturze dziala to bez tez powinno. Ale jezeli nie dziala to zapewne jest zdublowana nazwa tej funkcji... dodaj tam na koniec funkcji jakas liczbe np

a123123() i pamietaj zeby tez ja tak wywolywac

0

Jeśli chodzi o dodatkowe informacje, to wybaczcie, ale w tej chwili nie mam czasu na zajęcie się tym projektem z uwagi na inny, ale dzięki za rady, zobaczymy za kilka dni.

0

Słuchajcie, problem rozwiązany.

Mój kompilator to g++ 4.8.1 (MinGW w NetBeans). Zrobiłem, co następuje:

  1. Zmieniłem poziom ostrzeżeń kompilatora z domyślnego "Some warnings" na "More warnings".
  2. Usunąłem wcześniej utworzoną strukturę, o której pisałem.
  3. Pojawiło mi się ostrzeżenie co do INNEJ FUNKCJI. Zmieniłem więc jej sygnaturę (w deklaracji i w definicji).
  4. Pojawiło mi się ostrzeżenie co do niezgodności typów porównywanych w jakiejś tam pętli. Zmieniłem.

Od tej chwili kompilator i linker uznały, że wszystko jest ok, i nastąpił "BUILD SUCCEFUL". To były NAJPRAWDOPODOBNIEJ jedyne zmiany, które przeprowadziłem od błędu Undefined reference.

Po tym nawet zmieniłem poziom ostrzeżeń na mniejszy, bo pomyślałem sobie, czy to może jakiś bug NetBeansa, że wyższy poziom ostrzeżeń generuje mniej errorów, no ale nie, wszystko działało i po powrocie na "Some warnings" (oczywiście cały czas staram się naciskać "Clean and build").

Sam już nie wiem, czemu to działa teraz... pamiętam, że tam w błędzie linkera była ta funkcja wyjściowa, a (jak ją nazwałem)... ale może rzeczywiście to chodziło o tę INNĄ funkcję, tylko przeoczyłem nazwę... z drugiej strony, co ma Undefined reference do błędnego typu zwracanego? (identycznego w deklaracji i w definicji, chodziło tylko o to, że funkcja nic nie zwracała, a była int)

Cieszę się, że się udało, dzięki jeszcze raz wszystkim za rady. :) Nie mam czasu w to wnikać, ale jak ktoś by chciał, to może oczywiście się wypowiedzieć. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1