Gurus!
Я использую Ubuntu 13.10 64-bit для компиляции последней библиотеки Google RE2, но «make testinstall» не удалось скомпилировать, вот журнал:
kevin @ ubuntu: ~ / re2 $ make testinstall
cp testinstall.cc obj
(cd obj && g ++ -I / usr / local / include -L / usr / local / lib testinstall.cc -lre2 -pthread -o testinstall)
/tmp/ccSsaSXS.o: в функции main':
re2 :: FilteredRE2 :: FirstMatch (re2 :: StringPiece const&, std :: vector> const&) const ‘
testinstall.cc:(.text+0xce): undefined reference to
/usr/local/lib/libre2.so: неопределенная ссылка на pthread_rwlock_rdlock'
pthread_rwlock_wrlock»
/usr/local/lib/libre2.so: undefined reference to
/usr/local/lib/libre2.so: неопределенная ссылка на pthread_rwlock_destroy'
pthread_rwlock_init»
/usr/local/lib/libre2.so: undefined reference to
/usr/local/lib/libre2.so: неопределенная ссылка на `pthread_rwlock_unlock ‘
collect2: error: ld вернул 1 состояние выхода
делать: * [testinstall] Ошибка 1
Я попытался заменить -pthread на -lpthread, но все равно потерпел неудачу, затем сбросил libre2.so и обнаружил, что в нем есть pthread_xxx.
Вот отслеживание проблемы на форуме RE2: https://code.google.com/p/re2/issues/detail?id=100
Кто-нибудь здесь когда-либо успешно выполнял RE2? Спасибо!
Увидеть этот комментарий:
Добавление -pthread в LDFLAGS, кажется, исправляет
make test
(все тесты
мимоходом), но неmake testinstall
,
Это приведет вас к следующей ошибке
В зависимости от того, что вы создаете для ‘make testinstall’, может не потребоваться.
Мне просто нужно было заставить работать порт Python re2, и это можно установить после запуска make install.
Я столкнулся с этой проблемой раньше. Измените make-файл и используйте -lpthread вместо -pthread.
Поэтому я попытался найти строки в testinstall.cc, которые вызывали ошибки символов, и обнаружил, что единственная строка была в строке 18:
18 — f.firstMatch (: abbccc :, ids);
Я закомментировал эту строку (так что функция FullMatch ниже все еще вызывается) и просто запустил g ++ testinstall.cc -lre2 -pthread -o testinstall (в основном, что делает Makefile), и я смог успешно получить двоичный файл. Хотя это может и не решить проблему, полезно знать, что мы все еще можем использовать функции RE2 :: Fullmatch и частичное совпадение.
Если бы я догадался, может быть, есть зависимость где-то внутри модуля Filter_re2?
У меня такая же проблема. Но если вы скомпилируете с -static
все идет хорошо.
nm -C
показывает, что «пропавший» символ существует в обоих .a
а также .so
файлы.