Последние 2 дня я пытался установить IP2Location на свой Mac. Мне удалось установить библиотеку IP2Location C, теперь расширение PECL вызывает проблемы.
Я запустил phpize, а затем sudo ./configure и получаю следующую ошибку:
checking for ip2location support... yes, shared
checking for ip2location files in default path... found in /usr/local
checking for IP2Location_open_mem in -lIP2Location... no
configure: error: wrong ip2location, lib version >= 6.x.x is required or library not found
Я использую последнюю версию IP2Location, поэтому знаю, что это правильная версия.
Может кто-нибудь пролить свет на эту ошибку?
Я заглянул в config.log и обнаружил, что это последняя ошибка:
227 configure:4112: checking for ip2location files in default path
228 configure:4117: result: found in /usr/local
229 configure:4269: checking for IP2Location_open_mem in -lIP2Location
230 configure:4294: cc -o conftest -g -O2 -Wl,-rpath,/usr/local/lib -L/usr/local/lib conftest.c -lIP2Location >&5
231 ld: can't link with bundle (MH_BUNDLE) only dylibs (MH_DYLIB) file '/usr/local/lib/libIP2Location.so' for architecture x86_64
232 clang: error: linker command failed with exit code 1 (use -v to see invocation)
233 configure:4294: $? = 1
234 configure: failed program was:
235 | /* confdefs.h */
236 | #define PACKAGE_NAME ""
237 | #define PACKAGE_TARNAME ""
238 | #define PACKAGE_VERSION ""
239 | #define PACKAGE_STRING ""
240 | #define PACKAGE_BUGREPORT ""
241 | #define PACKAGE_URL ""
242 | /* end confdefs.h. */
243 |
244 | /* Override any GCC internal prototype to avoid an error.
245 | Use char because int might match the return type of a GCC
246 | builtin and then its argument prototype would still apply. */
247 | #ifdef __cplusplus
248 | extern "C"
249 | #endif
250 | char IP2Location_open_mem ();
251 | int
252 | main ()
253 | {
254 | return IP2Location_open_mem ();
255 | ;
256 | return 0;
257 | }
258 configure:4304: result: no
259 configure:4419: error: wrong ip2location, lib version >= 6.x.x is required or library not found
Я проверил и могу подтвердить, что /usr/local/lib/libIP2Location.so существует.
Запустить файл дает следующее:
$ file libIP2Location.so
libIP2Location.so: Mach-O 64-bit bundle x86_64
Внесите следующие изменения в IP2Location-C-Library и установите его снова с нуля. (sh build.sh).
И перекомпилируйте свой PECL. Пожалуйста, дайте мне знать результаты.
diff --git a/Makefile.am b/Makefile.am
index 37a4714..491c0bd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,3 +1,3 @@
NULL =
-INCLUDES = -Wall -ansi
+AM_CPPFLAGS = -Wall -ansi
SUBDIRS = libIP2Location test $(NULL)
diff --git a/libIP2Location/Makefile.am b/libIP2Location/Makefile.am
index 4bc5854..ed00358 100644
--- a/libIP2Location/Makefile.am
+++ b/libIP2Location/Makefile.am
@@ -9,4 +9,4 @@ include_HEADERS = IP2Location.h IP2Loc_DBInterface.h
libIP2Location_la_SOURCES = IP2Location.c \
IP2Loc_DBInterface.c
-libIP2Location_la_LDFLAGS = -module -no-undefined -version-info 1:0:0
+libIP2Location_la_LDFLAGS = -no-undefined -version-info 1:0:0
Это не ты, это код ...
Библиотека IP2Location C явно создает пакет (он же загружаемый модуль), но не разделяемую библиотеку. Связывание с пакетом во время сборки - это симпатичный трюк, который может выполнять сценарий GNU libtool в дереве сборки пакета, но обычно другие программы могут загружать пакеты только во время выполнения. Источник библиотеки Thge C также создает статическую библиотеку, которую расширение PECL МОЖЕТ связать во время сборки, но оно не пытается этого сделать. Оба пакета обслуживает один и тот же человек, поэтому вы, вероятно, сможете исправить это, предупредив его о проблеме. Для этого есть одно из следующих мест:
https://github.com/chrislim2888/IP2Location-PECL-Extension/issues https://github.com/chrislim2888/IP2Location-C-Library/issues
Я бы поспорил за последнее, поскольку мне это кажется ошибкой в процессе сборки библиотеки C, которая имеет кучу устаревших директив automake, произвольно добавляет / opt / lib / (не существует на большинстве Mac) в библиотеку путь поиска и строит 'тестовую' программу, которая генерирует убедительное предупреждение при связывании с libtool:
/bin/sh ../libtool --tag=CC --mode=link gcc -I/usr/include/malloc -no-cpp-precomp -L/opt/lib -o test-IP2Location test-IP2Location.o ../libIP2Location/libIP2Location.la
*** Warning: Linking the executable test-IP2Location against the loadable module
*** libIP2Location.so is not portable!
*** Warning: lib libIP2Location.so is a module, not a shared library
Возможно, вы могли бы взломать исправление, возясь с файлами autotools в исходном коде библиотеки C и перестроив реальную общую библиотеку ИЛИ (возможно) выяснив, как использовать libtool для ссылки на расширение PECL, но я бы тоже не советовал подходить.
Другой вариант: поддерживаемая привязка PHP для IP2Location - это модуль PHP, а не расширение PECL:
https://www.ip2location.com/developers/php
Это МОЖЕТ работать с модулем библиотеки C или статической библиотекой.