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
Author by
WarrenFaith
Updated on October 04, 2020Comments
-
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 outputgcc -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 almost 13 yearsbut running
gcc sortieren.o
after that results in the same error. -
Piotr Praszmo almost 13 yearsI edited my answer. Libraries, such as
-lpthread
, should be added during linking. I.e. when you combine your.o
files into executable. -
Drew Delano almost 13 years@WarrenFaith: The
gcc
command won't use your makefile. Trymake sortieren
. -
WarrenFaith almost 13 years@Fred Larson: I did that, read my update in the question, thanks so far!
-
Piotr Praszmo almost 13 yearsYou also have a typo
ptread_create
instead ofpthread_create
. -
WarrenFaith almost 13 yearsThat explains why your solution worked on the sample code but not on my... Thank you!
-
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 almost 13 yearsIts in the line:int ret = ptread_create(&threads[0], NULL, threadOne(), NULL); of yours in main