проблема с линковкой pthread
От: Stov  
Дата: 19.09.03 08:12
Оценка:
Привет!
Вчера столкнулся со следующей проблемой:
не удается слинковать следующую простейшую программу:


#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 ....
...

Re: проблема с линковкой pthread
От: Аноним  
Дата: 19.09.03 10:06
Оценка:
Здравствуйте, 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>...

Re: проблема с линковкой pthread
От: Аноним  
Дата: 19.09.03 11:31
Оценка:
вроде бы не так давно в glibc (или что там у них) менялось объявление errno.
Может быть libpthread хочет старый/новый runtime, а ты линкуешь с новым/старым
Re[2]: проблема с линковкой pthread
От: Stov  
Дата: 19.09.03 13:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>вроде бы не так давно в glibc (или что там у них) менялось объявление errno.

А>Может быть libpthread хочет старый/новый runtime, а ты линкуешь с новым/старым

Работаю на RedHat 9.0 — никаких дополнительных компонент, я не устанавливал. IMHO сомневаюсь, что в дистрибутив включили бы, не совместимые версии библиотек.
В newsgroup-ах советуют использовать флаг -pthread g++ компилятора, при компиляции многопоточных программ. Попробую, может поможет, хотя если верить документации ( а ей обычно стоит доверять ), этот флаг не совсем из той оперы.
Re[3]: проблема с линковкой pthread
От: Murr Россия  
Дата: 19.09.03 21:09
Оценка:
Здравствуйте, Stov, Вы писали:

S>В newsgroup-ах советуют использовать флаг -pthread g++ компилятора, при компиляции многопоточных программ. Попробую, может поможет, хотя если верить документации ( а ей обычно стоит доверять ), этот флаг не совсем из той оперы.

Нужно всегда писать -pthread. Из документации следует, что оно делает дополнительный preprocessing. А ты чтоль -lpthread пишешь?
Re[4]: проблема с линковкой pthread
От: Stov  
Дата: 22.09.03 05:49
Оценка:
все оказалось не так просто
дело в том, что у меня не получается 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
Re: проблема с линковкой pthread
От: VladimirV  
Дата: 23.09.03 13:28
Оценка:
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 — статическая либа.
Re[5]: проблема с линковкой pthread
От: Аноним  
Дата: 23.09.03 19:55
Оценка:
КDevelop не компилятор, а среда разработки.
Для правильной расстановки флагов и работы с KDevelop надо:
man automake
man autoconf

На 9-й линейке RatHat — новоя модель потоков nptl.
gdb с ней пока не в ладах.
Не ставьте breakpoint`ы в потоковых функциях!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.