Привет!
Вчера столкнулся со следующей проблемой:
не удается слинковать следующую простейшую программу:
#include <pthread.h>
void* f( void* )
{
int i = 1;
return NULL;
}
int main()
{
pthread_t p;
pthread_create( &p, NULL, f, NULL );
return 1;
}
g++ main.cpp -lpthread
что самое удивительное — если прилинковываю библиотеки статически
g++ main.cpp -lpthread -lstdc++ -static
то линкер не ругается.
К сожалению точных ошибок выдаваемых линкером я сейчас привести не могу ( т.к. нахожусь на работе ). Ошибки примерно следующего характера:
undefined reference to "__syscall_error" in \usr\lib\..\..\libpthread.a ....
undefined reference to "__errno" in \usr\lib\..\..\libpthread.a ....
...
Здравствуйте, Stov, Вы писали:
S>Привет!
S>Вчера столкнулся со следующей проблемой:
S>не удается слинковать следующую простейшую программу:
S>S>#include <pthread.h>
S>void* f( void* )
S>{
S> int i = 1;
S> return NULL;
S>}
S>int main()
S>{
S> pthread_t p;
S> pthread_create( &p, NULL, f, NULL );
S> return 1;
S>}
S>
S>S>g++ main.cpp -lpthread
S>что самое удивительное — если прилинковываю библиотеки статически
S>S>g++ main.cpp -lpthread -lstdc++ -static
S>то линкер не ругается.
S>К сожалению точных ошибок выдаваемых линкером я сейчас привести не могу ( т.к. нахожусь на работе ). Ошибки примерно следующего характера:
S>S>undefined reference to "__syscall_error" in \usr\lib\..\..\libpthread.a ....
S>undefined reference to "__errno" in \usr\lib\..\..\libpthread.a ....
S>...
вроде бы не так давно в glibc (или что там у них) менялось объявление errno.
Может быть libpthread хочет старый/новый runtime, а ты линкуешь с новым/старым
Здравствуйте, Аноним, Вы писали:
А>вроде бы не так давно в glibc (или что там у них) менялось объявление errno.
А>Может быть libpthread хочет старый/новый runtime, а ты линкуешь с новым/старым
Работаю на RedHat 9.0 — никаких дополнительных компонент, я не устанавливал. IMHO сомневаюсь, что в дистрибутив включили бы, не совместимые версии библиотек.
В newsgroup-ах советуют использовать флаг -pthread g++ компилятора, при компиляции многопоточных программ. Попробую, может поможет, хотя если верить документации ( а ей обычно стоит доверять

), этот флаг не совсем из той оперы.
Здравствуйте, Stov, Вы писали:
S>В newsgroup-ах советуют использовать флаг -pthread g++ компилятора, при компиляции многопоточных программ. Попробую, может поможет, хотя если верить документации ( а ей обычно стоит доверять
), этот флаг не совсем из той оперы.
Нужно всегда писать -pthread. Из документации следует, что оно делает дополнительный preprocessing. А ты чтоль -lpthread пишешь?
все оказалось не так просто
дело в том, что у меня не получается shared слинковать программы, использующие thread-ы.
ok — static линк работает прекрасно. казалось бы все отлично — но не тут то было. оказывается мой KDevelop отказывается статически линковать программы.
1. пытался указывать флажок в установках проекта
2. пытался изменять configure.in.in файл, так чтобы в нем были по кмолчанию доступны static libraries — AC_ENABLE_STATIC(true)
но к сожалению ничего не получается — может посоветуете, как заставить KDevelop статически линковать программы — система RedHat 9.
с другой стороны я решил забить на написание программ в KDE и довольствоваться командной сторокой — используя только отладчик KDebug или отладчик KDevelop-а.
компиляю программу
[/c]
#include <pthread.h>
void* f( void* )
{
int i = 1;
return NULL;
}
int main()
{
pthread_t p;
pthread_create( &p, NULL, f, NULL ); // (***)
return 1;
}
[/c]
g++ main.cpp -pthread -static -g
однако отладчик при создании потока (***) говорит — segmentation fault.
тоже самое — segmentation fault — выдает и KDebug
S>S>#include <pthread.h>
S>void* f( void* )
S>{
S> int i = 1;
S> return NULL;
S>}
S>int main()
S>{
S> pthread_t p;
S> pthread_create( &p, NULL, f, NULL );
S> return 1;
S>}
S>
S>S>g++ main.cpp -lpthread
Все должно собираться! Потому как земля крутится.
S>что самое удивительное — если прилинковываю библиотеки статически
S>S>g++ main.cpp -lpthread -lstdc++ -static
S>то линкер не ругается.
S>К сожалению точных ошибок выдаваемых линкером я сейчас привести не могу ( т.к. нахожусь на работе ). Ошибки примерно следующего характера:
S>S>undefined reference to "__syscall_error" in \usr\lib\..\..\libpthread.a ....
S>undefined reference to "__errno" in \usr\lib\..\..\libpthread.a ....
S>...
А ты говоришь статически — собираются — libpthread.a — статическая либа.
КDevelop не компилятор, а среда разработки.
Для правильной расстановки флагов и работы с KDevelop надо:
man automake
man autoconf
На 9-й линейке RatHat — новоя модель потоков nptl.
gdb с ней пока не в ладах.
Не ставьте breakpoint`ы в потоковых функциях!