неопределенная ссылка на `pthread_mutex_trylock ' - PullRequest
13 голосов
/ 06 января 2010

У меня есть следующая тестовая программа.

#include <iostream>
#include <cstdlib>

using namespace std;    
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;

int main(int argc, char *argv[])
{
  int iret;
  iret = pthread_mutex_trylock( & mymutex );
  cout << "Test2 !!! " << endl;
  pthread_mutex_unlock( & mymutex );
  return EXIT_SUCCESS;
}

Если я скомпилирую его без добавления библиотеки pthread, я получу ошибку за неразрешенную ошибку для pthread_mutex_trylock, но только для функции pthread_mutex_trylock.

Если я заменю pthread_mutex_trylock на pthread_mutex_trylock, программа будет скомпилирована и хорошо запущена также без опции -lpthread *.

Если я добавлю опцию -lpthraed к командам компиляции, все будет работать хорошо это хорошо работает: $ g ++ test2.c -o test2 -lpthread это предупреждение не устранено: $ g ++ test2.c -o test2

Пример вывода ошибки: $ g ++ test2.c -o test2 /tmp/ccU1bBdU.o: в функции main': test2.c:(.text+0x11): undefined reference to pthread_mutex_trylock ' collect2: ld вернул 1 статус выхода

Если я заменю инструкцию iret = pthread_mutex_trylock (& ​​mymutex);

с iret = pthread_mutex_lock (& ​​mymutex); программа компилируется и запускается без ошибок, даже если не добавила библиотеку pthread в команду compile Я знаю, что правильно иметь неразрешенную ошибку, если я не использовал опцию -lpthread, но почему у меня нет такой же неразрешенной ошибки и для другой функции pthread_?

Я использую gcc 4.4.2 на fedora 12

$ g++ --version
g++ (GCC) 4.4.2 20091222 (Red Hat 4.4.2-20)
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Есть ли у некоторых предположения о значении этой ссылки только для pthread_mutex_trylock?

спасибо за помощь, Энцо

Ответы [ 2 ]

16 голосов
/ 06 января 2010

Если вы используете функции pthread, вам следует связать свои объектные файлы с -lpthread и не беспокоиться о том, включены ли символы в libc.

Основанием для этого является , сказанное таковым: некоторое время назад заглушки в libc использовались, когда приложение, которое использовало потоки, было запущено в системе без поддержки потоков. В такой системе функции pthread_* стали связаны с заглушками libc, которые возвращали ошибки, указывающие на то, что функции потоков отсутствуют. В то время как в «поточных» системах они были связаны с библиотекой pthread и работали правильно.

Очевидно, что функция pthread_mutex_trylock появилась после того, как политика изменилась на связывание с -lpthread. Так что для этого нет заглушки.

14 голосов
/ 06 января 2010

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

Если вам интересно посмотреть, что -pthread сделает с вашими флагами компиляции и ссылки, запустите gcc -dumpspecs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...