Compile/link error using pthread

20,210
sortieren : sortieren.o
    gcc sortieren.o

sortieren.o : sortieren.c 
    gcc -pthread -c sortieren.c

Should be:

sortieren : sortieren.o
    gcc -lpthread sortieren.o

sortieren.o : sortieren.c 
    gcc -c sortieren.c
Share:
20,210
WarrenFaith
Author by

WarrenFaith

Updated on October 04, 2020

Comments

  • WarrenFaith
    WarrenFaith over 3 years

    I try to make a little program that sorts an array using threads but I can't get it to compile with the thread support.

    Error:

    sortieren.c:(.text+0xd7): undefined reference to `ptread_create'
    

    I used a make file for easy compiling but also on command line I can't get it to work.

    Basic code:

    #include <pthread.h>
    int main(int argc, char **argv) {
        pthread_t threads[2];
        // code snipped
        int ret = ptread_create(&threads[0], NULL, threadOne(), NULL);
        printf("ret: %d\n", ret);
        // code snipped
    }
    

    Make file:

    sortieren : sortieren.o
        gcc sortieren.o
    
    sortieren.o : sortieren.c 
        gcc -pthread -c sortieren.c
    

    Using make sortieren results in this output

    gcc -pthread -c sortieren.c
    gcc sortieren.o
    sortieren.o: In function `main':
    sortieren.c:(.text+0xd7): undefined reference to `ptread_create'
    collect2: ld returned 1 exit status
    make: *** [sortieren] Fehler 1
    

    Of course I tried to google but every "solution" I found didn't worked for me. I tried -pthread or -lpthread everywhere in my make file. To be sure that I didn't do anything wrong in my code, I also tried a public sample:

    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define NUM_THREADS 5
    
    void *PrintHello(void *threadid)
    {
       long tid;
       tid = (long)threadid;
       printf("Hello World! It's me, thread #%ld!\n", tid);
       pthread_exit(NULL);
    }
    
    int main(int argc, char *argv[])
    {
      pthread_t threads[NUM_THREADS];
      int rc;
      long t;
      for(t=0;t<NUM_THREADS;t++){
        printf("In main: creating thread %ld\n", t);
        rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
        if (rc){
          printf("ERROR; return code from pthread_create() is %d\n", rc);
          exit(-1);
        }
      }
      pthread_exit(NULL);
    }
    

    The error is the same there.

    System: Ubuntu 11.04 64bit, GCC-Version 4.5.2

    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/lto-wrapper
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.2-8ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --with-multiarch-defaults=x86_64-linux-gnu --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib/x86_64-linux-gnu --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib/x86_64-linux-gnu --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --enable-ld=default --with-plugin-ld=ld.gold --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Thread model: posix
    gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
    

    Update

    Using what @Banthar mentioned doesn't work, too.

    $ make sortieren
    gcc -c sortieren.c
    gcc -lpthread sortieren.o
    sortieren.o: In function `main':
    sortieren.c:(.text+0xd7): undefined reference to `ptread_create'
    collect2: ld returned 1 exit status
    make: *** [sortieren] Fehler 1
    
  • WarrenFaith
    WarrenFaith almost 13 years
    but running gcc sortieren.o after that results in the same error.
  • Piotr Praszmo
    Piotr Praszmo almost 13 years
    I edited my answer. Libraries, such as -lpthread, should be added during linking. I.e. when you combine your .o files into executable.
  • Drew Delano
    Drew Delano almost 13 years
    @WarrenFaith: The gcc command won't use your makefile. Try make sortieren.
  • WarrenFaith
    WarrenFaith almost 13 years
    @Fred Larson: I did that, read my update in the question, thanks so far!
  • Piotr Praszmo
    Piotr Praszmo almost 13 years
    You also have a typo ptread_create instead of pthread_create.
  • WarrenFaith
    WarrenFaith almost 13 years
    That explains why your solution worked on the sample code but not on my... Thank you!
  • R.. GitHub STOP HELPING ICE
    R.. GitHub STOP HELPING ICE almost 13 years
    -lpthread and other -l options must be at the end of the linker command line, not the beginning.
  • Shweta
    Shweta almost 13 years
    Its in the line:int ret = ptread_create(&threads[0], NULL, threadOne(), NULL); of yours in main