Ошибка компоновщика: неопределенная ссылка на символ 'pthread_rwlock_trywrlock@@GLIBC_2.2.5'
Я разрабатывал с CentOS, Qt 4.7 и GCC 4.4
Я только что установил Red Hat Developer Toolset 1.1, который включает GCC 4.7.2, и в конце make
Я получаю ошибку
/usr/bin/ld: ../../bin/Solo: undefined reference to symbol 'pthread_rwlock_trywrlock@@GLIBC_2.2.5'
/usr/bin/ld: note: 'pthread_rwlock_trywrlock@@GLIBC_2.2.5' is defined in DSO /lib64/libpthread.so.0 so try adding it to the linker command line
/lib64/libpthread.so.0: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
Я предполагаю, что потоки Qt ссылаются на это. Как я могу это исправить?
4 ответа
Вы хотите скомпилировать с -pthread
который делает больше, чем просто ссылка на libpthread:
Добавляет поддержку многопоточности с библиотекой pthreads. Эта опция устанавливает флаги для препроцессора и компоновщика.
Прочитайте заметку: попробуйте добавить /lib64/libpthread.so.0
в Makefile (-lpthread
после gcc
команда или /lib64/libpthread.so.0
после ld
(или после gcc -shared
)) или что-то вроде LIB += -lpthread
если где-то есть такое определение.
Смотрите также: Добавление внешней библиотеки в проект Qt Creator и http://www.qtcentre.org/threads/39144-How-to-add-a-lib-to-a-qt-project
Кстати, опубликуйте свой Makefile, чтобы кто-нибудь смог указать точную строку.
В моем маленьком ноутбуке Linux (где у меня смешанный пакет библиотек) мне просто нужно было добавить
LDFLAGS=-lpthread
В конце аргументов команды configure.
После этого make отлично справился со своей задачей (с существующими библиотеками).
Я получил аналогичные ошибки "Ошибка компоновщика: неопределенная ссылка на символ" при попытке скомпилировать и установить Python-3.7.2 во FreeBSD 12.
/usr/bin/ld: error: undefined symbol: _Py_GetGlobalVariablesAsDict
/usr/bin/ld: error: undefined symbol: _PyCoreConfig_AsDict
/usr/bin/ld: error: undefined symbol: _PyMainInterpreterConfig_AsDict
Решено путем прохождения LDFLAGS=-lpthread
непосредственно сделать из lang/python37 или добавив в /etc/make.conf
, При использовании portmaster для установки / обновления используйте -m
передать аргумент, чтобы сделать, например,portmaster -a -m 'LDFLAGS=-lpthread'