Undefined ссылка на `pthread_mutex_trylock '
У меня есть следующая тестовая программа.
#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/ccU 1bBdU.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); программа компилируется и запускается без ошибок также, если не добавляла pantread libarry в команду компиляции
Я знаю, что правильно иметь нерешенную ошибку, если я не использовал параметр -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?
спасибо за помощь, Enzo
Ответы
Ответ 1
Если вы используете функции pthread, вы должны связать свои объектные файлы с -lpthread
и не беспокоиться о том, включены ли символы в libc
.
Обоснованием этого является сказал, чтобы быть таким: некоторое время назад заглушки в libc использовались, когда приложение, использующее потоки, выполнялось на без поддержки резьбы. В такой системе функции pthread_*
стали связанными с libc
заглушками, которые возвращали ошибки, показывающие, что нет функции потоковой передачи. В то время как на "поточных" системах они были связаны с библиотекой pthread
и работали правильно.
Очевидно, что функция pthread_mutex_trylock
появилась после изменения политики на связь с -lpthread
. Так что там нет заглушки.
Ответ 2
Вы должны выполнить как компиляцию, так и связь с опцией -pthread
, чтобы быть переносимой. В некоторых системах в компиляции будут добавлены определенные флаги (например, -D_REENTRANT
) с указанным -pthread
.
Если вам интересно посмотреть, что -pthread
сделает с вашими флагами компиляции и ссылок, запустите gcc -dumpspecs
.