[C++] (DeV)Undefined reference to `rename(int)'


(Sheaker) #1

Witam. Wywala mi błąd:

[Linker error] undefined reference to `rename(int)'

gdy chcę użyć biblioteki którą napisałem. Spędziłem już bardzo dużo czasu i nie widzę rozwiązania choć może być banalne. PLIK NAGŁÓWKOWY:

#ifndef _RENAME_H_

#define _RENAME_H_


extern int rename(int x);


#endif

PLIK ŹRÓDŁOWY:

#include "rename.h"

#include 


int main(int x){

x = sqrt(x);

x = floor(x);

return(x);

}

(Świadomie zmiana z double na int)

Proszę o pomoc.


(Sawyer47) #2

No ok, ale gdzie masz funkcję rename? Deklarujesz ją, a nie ma definicji. Natomiast ostatni fragment kodu to pominę milczeniem, chyba nie to wkleiłeś co chciałeś.


(Sheaker) #3

Zatem jak mam zrobić defenicję? Skoro chcę żeby funkcja rename użyta w programie np:

#include

#include

main(){

int a;

a = rename(11);

std::cout << a;

getchar();

return(0);

}

Wyświetliła mi pierwiastek z 11 zaokrąglony w dół??


(Sawyer47) #4

No już lepiej, chociaż mam wrażenie, że nie za bardzo wiesz co robić.

rename.h

...

int rename(int x);

 ...

rename.cpp

...

int rename(int x)

{

	...

}

...

Przykładowy plik, gdzie wykorzystasz funkcję:

#include "rename.h"


int main()

{

	int result = rename(11);

	...

}

Tak to mniej więcej wygląda.


(Sheaker) #5

w pliku rename.cpp

No i właśnie z kolei jak zamiast main() daje rename(int x) to przy kompilacji pliku wywala błąd:

[Linker error] undefined reference to `WinMain@16'

(Murzyn1) #6

błąd linkera Dev-cpp (pewnie kompiluje twój program jako Win32 GUI PROGRAM i szuka bibliotek), trzeba odpowiednio założyć projekt w dev-cpp (jeśli to jest prosty program, jak wyżej to najlepiej jako CONSOLE PROGRAM)


(Sheaker) #7

Niestety to samo...


(Sawyer47) #8

Pokaż cały kod który kompilujesz.


(Sheaker) #9

Plik nagłówkowy:

// random.h


#ifndef _RANDOM_H_

#define _RANDOM_H_


extern int random(int x);



#endif

Plik źródłowy:

#include "random.h"

#include 

#include 

#include 



int random(int x){


int b=0, c, d=27, e=0;        

int a=0;

float i;

srand(time(0));

        if(x != 0){

        a = (rand() % x);





            if((a % 2) == 0){


            //double(a);

            i = (a / 13.0000000000000);


            i = (i - floor(i));

                do{


                    if(e < 10){


                    c = (rand() % 9);

                    b++;

                    }

                    if(e>9){


                    c = (rand() % 9);

                    b--;

                    }

                e++;

                    if(e == 19) e = 0;

                }while(c != 5);


            a = (i*(pow(10,b)));

            }





            else{

            //double(a);


            i = (a / 14.00000000000);

            i = (i - floor(i));

                do{


                    if(e < 10){ 


                    c = (rand() % 9);

                    b++;

                    }

                    if(e>9){


                    c = (rand() % 9);

                    b--;

                    }

                e++;

                    if(e == 19) e = 0;

                }while(c != 5);

            a = (i*pow(10,b));

            }





        }

        else{

            a = rand();

                if(a < 0) a= (-a);


                if(a < 100){

                //double(a);

                a = 27*tan(a);

                }

                if(a > 99){

                    if((2 % a) == 0){

                    //double(a);

                    a = (a/97);

                    a = (a - floor(a));

                        do{

                // srand(time(0));

                        c = (rand() % 9);

                        b++;

                        }while(c != 5);

                    a = (a*pow(10,b));

                    a = round(a);

                    }

                    else{

                    //double(a);

                    a = (a/94);

                    a = (a - floor(a));

                        do{

                // srand(time(0));

                        c = (rand() % 9);

                        b++;

                        }while(c != 5);

                    a = (a*pow(10,b));

                    a = round(a);

                    }               

                }


        }

return a;

}

Przykład zastosowania w innym programie:

#include 

#include 


main(){

int a;

a = random(11);

std::cout << a;

getchar();

}

(Sawyer47) #10

W przykładowym kodzie 2 rzeczy:

1) #include - gdzie znajduje się plik nagłówkowy? Jeżeli podajesz ścieżkę to wtedy #include "random.h", pisząc nazwę w ostrych nawiasach sugerujesz, że plik znajduje się w folderze razem z plikami standardowymi (jak np. iostream)

2) Nie wiem czy to przez przeoczenie, ale już drugi raz piszesz "main() {...}", a przecież funkcja main musi zwracać int


(Sheaker) #11

AD1:

Zarówno plik random.h jak i random.c znajdują się w katalogu

C:\Dev-Cpp\include

AD2:

Jeżeli mówisz o

#include 

#include 


main(){

int a;

a = random(11);

std::cout << a;

getchar();

}

to przypadek. Pisałem bezpośrednio w przeglądarce bo to nie istotne. Mój roblem dotyczy kompilacji pliku "random.c".


(Sawyer47) #12

U mnie bez problemu się kompiluje:

// random.h

#ifndef _RANDOM_H_

#define _RANDOM_H_


int random(int x);


#endif

// random.cpp

#include "random.h"


int random(int x)

{

	return x;

}

// main.cpp

#include 

#include "random.h"


int main()

{

	int a;

	a = random(11);

	std::cout << a << "\n";

	return 0;

}

Spróbuj najpierw ten prosty kod skompilować, powinien działać.


(Sheaker) #13
// random.cpp

#include "random.h"


int random(int x)

{

   return x;

}

nie kompiluje się. Może log z kompilacji powie wam więcej niż mi:

Kompilator: Default compiler

Wykonywanie gcc.exe...

gcc.exe "C:\Dev-Cpp\include\random.c" -o "C:\Dev-Cpp\include\random.exe" -g3 -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -g3 

C:\Dev-Cpp\lib/libmingw32.a(main.o)(.text+0x106):main.c: undefined reference to `WinMain@16'

collect2: ld returned 1 exit status


Wykonanie zakończone

EDIT: Zaszedłem krok dalej. Gdzieśtam w opcjach kompilatora dodałem "-c" do parametrów kompilacji i kompiluje się już plik random.cpp Mimo wszystko podczas kompilacji pliku main.cpp dalej wywala error

[Linker error] undefined reference to `random(int)'

(Sawyer47) #14

No to i tak musisz podać te pliki kompilatorowi. Masz 2 możliwości, albo podać same źródła:

// kompilacja main.cpp

g++ main.cpp random.cpp

Albo źródło main.cpp i już skompilowany plik obiektowy:

g++ -c random.cpp

// i później

g++ main.cpp random.o

(Sheaker) #15

Używam kompilatora dev C++ i u mnie to się jakoś automatycznie robi a nie tekstowo(napieram ctrl+f9 i mi kompiluje. nie wiem jak to zrobić w trybie tekstowym.)


(Sawyer47) #16

DevC++ z tego co wiem korzysta z MinGW, w którego skład wchodzi m.in. GCC. Czyli wystarczy, że znajdziesz gdzie DevC++ trzyma g++ i skompilujesz z konsoli.


(Sheaker) #17

No bomba utworzyło plik i działa!! SUPER!!

Więc już ostatnie pytanie. Co teraz zrobić żebym mógł po prostu napisać "#include " i móc używać funkcji losującej liczbę w każdym programie?

Dodam że pliki random.h oraz random.cpp (i w tym wypadku main.cpp o treści takiej jak w poprzednich postach) umieszczone są obecnie w katalogu c:/dev-cpp/bin (tam gdzie kompilator g++.exe) i gdy przeprowadzam kompilację z konsoli "g++ main.cpp random.cpp" wszystko działa. Jednak wciąż gdy chcę kompilację przeprowadzić z dev-C++ nieustannie wywala

[Linker error] undefined reference to `random(int)'

(Fiołek) #18

Musisz dodać do projektu plik random.cpp lub zrobić z niego bibliotekę.


(Sawyer47) #19

Pod GNU/Linux jest to katalog /usr/include, więc szukaj katalogu o nazwie "include" lub podobnej w strukturze katalogów DevC++. Zawsze możesz też dodać do polecenia opcję -Idir (duże i oraz katalog), tyle, że trzeba to robić każdorazowo.

g++ -I/home/name/includes

Pewnym obejściem jest zrobienie aliasu w stylu g++-with-random="g++ -Idir", ale jak to zrobić w Windows to nie wiem.

Niestety na Windows chyba nie możesz używać man, przynajmniej bez instalacji, tak to musisz poszukać podręcznik g++ w sieci, np tutaj: http://bama.ua.edu/cgi-bin/man-cgi?gcc tylko nie wiem czy to do twojej wersji, musiałbyś sprawdzić. Tam masz opis opcji gcc, tak na przyszłość.


(Sheaker) #20

Ok dziękuję wszystkim. Już wszystko jasne.

Pzdrawiam