Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C++] pthreads en zijn flags (undefined reference) [Linux]

Pagina: 1
Acties:

  • Fusioxan
  • Registratie: November 2009
  • Laatst online: 21-11 10:17
Hoihoi,

Voor school moeten we een scriptje schrijven dat het aantal bytewaarde 0x42 telt in enkele bestanden. De voorwaarde van dit scriptje is dat het gebruik moet maken van (meerdere) threads.

Voor windows is hier leuk de klasse thread voor. Voor Linux ook, mits C++11. Echter begon eclipse hier constant over te zeuren, dat ik toch maar via pthreads ben gaan werken. Helaas krijg ik hier ook weer een foutmelding. Namelijk de wel-zo-bekende 'Undefined reference'.

Enkele dingen die ik heb gedaan en noemenswaardig zijn:
  1. Bovenaan mijn code staat netjes #include <pthread.h>
  2. In eclipse heb ik bij project propeties de flags veranderd, zowel met -lp, -lpthread en -pthread
  3. Code opnieuw geschreven
Om een ideetje te geven wat ik aan het doen ben.
Ik maak enkele threads aan, met als parameter van de routine een string* met de bestandslocatie. De routine wordt (ofja, is de bedoeling) dan aangeroepen en maakt gebruik van een functie om de bytes te tellen. Deze returnt een integer die hem weer netjes uitprint in mijn console. Als een van de threads klaar is, wordt deze herladen met een ander filepath, totdat er geen filepaths meer in de vector zitten.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
    void* search42(void *filepath);
    pthread_t threads[10];

    Filereader foo;
    std::vector<string> bar = foo.getFiles(path.c_str());

    for(char counter = 0; counter< 10; counter++)
    {
        if(!pthread_create(&threads[counter], NULL, search42, &bar.at(counter)))
        {
            cout << "yay";
        }
    }


Hier zit ik echter al 2 dagen in vast. De eerste 3 pagina's van Google hebben me helaas niet kunnen helpen. Ik hoop dat we hier op GoT aan 1 pagina genoeg hebben. :+

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
"Undefined reference" is een error die je krijgt tijdens ... ?

Je oplossingspogingen laten zien dat je niet begrijpt welke fasen van compilatie er zijn. Includes worden verwerkt door de preprocessor; daarna volgt de compilatie (waarbij de pthreads types nodig zijn), en vervolgens linking (waarbij referenties naar functies elders worden vastgesteld). Tenslotte heb je nog het laden en uitvoeren van een programma.

Je noemt #include en libraries als relevante stappen, maar als je eerst had vastgesteld in welke fase het probleem optreed dan had je tenminste 1 van de twee uit kunnen sluiten.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Fusioxan
  • Registratie: November 2009
  • Laatst online: 21-11 10:17
Excuses daarvoor. Nogmaals het bekijken van de console zag ik dat het verkeerd gaat bij het linken.
Invoking: GCC C++ Linker
g++ -o "OS" ./src/Filereader.o ./src/Highscores.o ./src/OS.o ./src/main.o ./src/tmp.o
./src/main.o: In function `main':
/media/Dropbox/Workspaces/Eclipse/OS/Debug/../src/main.cpp:37: undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
make: *** [42] Error 1

Voordat hij gaat linken is er nergens een error of een warning te zien. Kan het dan zijn dat hij pthreads gewoonweg niet kent? In /usr/include zie ik wel pthread.h staan (al heeft dit denk ik met de preprocessor te maken?).

Verwijderd

Ok, en waar is die -lpthread dan? Die zou je daar wel verwachten toch?

  • Fusioxan
  • Registratie: November 2009
  • Laatst online: 21-11 10:17
Het is opgelost! Domme fout, maar ook die zijn er om gemaakt te worden. Ik had enkel bij de C++ compiler de bovenstaande flags geprobeerd. Bij de C++ Linker had ik dit niet gedaan, vandaar dat het fout ging.

Ik heb het ook nog nooit zo bekeken. De volgende keer zal ik weer deze stappen doorlopen die MSalters genoemd heeft.

In ieder geval bedankt allebei!

[ Voor 24% gewijzigd door Fusioxan op 14-05-2014 22:59 ]


  • epic007
  • Registratie: Februari 2004
  • Laatst online: 17-11 15:31
Zo zie je maar.. een C++ programma maken is toch iets gecompliceerder dan een 'scriptje' schrijven ;-)

  • leroyk2
  • Registratie: Juli 2009
  • Niet online
Om gebruik te maken van threads in C++11 moet je sowieso gebruik maken van -lpthread . Bij gcc moet je ook aangeven dat je gebruik wil maken van C++11. Hiervoor moet je de flag -std=c++0x gebruiken. Dan kan je gewoon gebruik maken van de std threads.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Nee, de vlag is tegenwoordig `-std=c++11`. En dat zal niet zo lang meer nodig zijn, aangezien C++11 de norm wordt, en C++03 de uitzondering. Ik geloof niet dat je -lpthread nodig hebt voor C++ threads, alleen voor POSIX threads.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1