Назад | Перейти на главную страницу

IP2Location PECL Extension не устанавливается на Mac, не может связываться только с dylib.

Последние 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 или статической библиотекой.