Я использую macOS Catalina 10.15.7, и мне нужно установить Oracle Instant Client, чтобы запустить сценарий Perl, который подключается к БД.
Я скачал нужные мне пакеты:
Из Instant Client 19.8 и следовал инструкциям по установке без каких-либо проблем (просто копирование и вставка)
Файлы извлекаются в
/Users/username/Downloads/instantclient_19_8
ORACLE_HOME
Затем я установил для ORACLE_HOME значение /Users/username/Downloads/instantclient_19_8
export ORACLE_HOME=/Users/username/Downloads/instantclient_19_8
DBD::Oracle
Когда я попытался установить DBD::Oracle
, я получил следующую ошибку:
$ cpanm DBD::Oracle
--> Working on DBD::Oracle
Fetching http://www.cpan.org/authors/id/M/MJ/MJEVANS/DBD-Oracle-1.80.tar.gz ... OK
Configuring DBD-Oracle-1.80 ... N/A
! Configure failed for DBD-Oracle-1.80. See /Users/username/.cpanm/work/1608142485.48272/build.log for details.
Содержимое лог-файла:
$ cat /Users/username/.cpanm/work/1608142485.48272/build.log
cpanm (App::cpanminus) 1.7044 on perl 5.032000 built for darwin-thread-multi-2level
Work directory is /Users/username/.cpanm/work/1608142485.48272
You have make /usr/bin/make
You have LWP 6.47
You have /usr/bin/tar: bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6
You have /usr/bin/unzip
Searching DBD::Oracle () on cpanmetadb ...
--> Working on DBD::Oracle
Fetching http://www.cpan.org/authors/id/M/MJ/MJEVANS/DBD-Oracle-1.80.tar.gz
-> OK
Unpacking DBD-Oracle-1.80.tar.gz
Entering DBD-Oracle-1.80
Checking configure dependencies from META.json
Checking if you have Config 0 ... Yes (5.032000)
Checking if you have Encode 0 ... Yes (3.06)
Checking if you have Math::BigInt 0 ... Yes (1.999818)
Checking if you have Devel::Peek 0 ... Yes (1.28)
Checking if you have Test::More 0 ... Yes (1.302177)
Checking if you have ExtUtils::MakeMaker 6.58 ... Yes (7.44)
Checking if you have Data::Dumper 0 ... Yes (2.174)
Checking if you have DBI 1.623 ... Yes (1.643)
Checking if you have Test::NoWarnings 0 ... Yes (1.04)
Configuring DBD-Oracle-1.80
Running Makefile.PL
Using DBI 1.643 (for perl 5.032000 on darwin-thread-multi-2level) installed in /usr/local/Cellar/perl/5.32.0/lib/perl5/site_perl/5.32.0/darwin-thread-multi-2level/auto/DBI/
Configuring DBD::Oracle for perl 5.032000 on darwin (darwin-thread-multi-2level)
If you encounter any problem, a collection of troubleshooting
guides are available under lib/DBD/Oracle/Troubleshooting.
'DBD::Oracle::Troubleshooting' is the general troubleshooting
guide, while platform-specific troubleshooting hints
live in their labelled sub-document (e.g., Win32
hints are gathered in 'lib/DBD/Oracle/Troubleshooting/Win32.pod').
Trying to find an ORACLE_HOME
Your DYLD_LIBRARY_PATH env var is set to ''
The ORACLE_HOME environment variable is not set and I couldn't guess it.
It must be set to hold the path to an Oracle installation directory
on this machine (or a machine with a compatible architecture).
See the appropriate troubleshooting guide for your OS for more information.
ABORTED!
-> N/A
-> FAIL Configure failed for DBD-Oracle-1.80. See /Users/username/.cpanm/work/1608142485.48272/build.log for details.
Я прочитал здесь, что ORACLE_HOME
должно быть установлено значение каталога, который содержит каталог /bin
, но я не могу найти /bin
.
macOS всегда меняется, но в Мохаве я установил Instant Client из DMG, а затем сделал:
brew install perl
ln -s $HOME/Downloads/instantclient_19_8 $HOME/instantclient
export DYLD_LIBRARY_PATH=$HOME/instantclient
cpan -i -T DBI
cpan -i -T DBD::Oracle
В общем, никогда не устанавливайте ORACLE_HOME для Instant Client. (Это может привести к чтению неправильных файлов конфигурации). ORACLE_HOME используется для «полной» базы данных или полной установки клиента, а не для Instant Client. Однако некоторые установщики по-прежнему ссылаются на эту переменную для поиска файлов сборки, поэтому она вам понадобится — по крайней мере, во время сборки. DBD::Oracle будет выполнять внутренний поиск Instant Client и использовать $HOME/instantclient, если $ORACLE_HOME не установлен.
macOS постепенно убрала полезность DYLD_LIBRARY_PATH, поскольку она не распространяется на подоболочки. Это означает, что его нельзя надежно использовать. В Мохаве я обнаружил, что в качестве альтернативы можно скопировать библиотеки Instant Client в $HOME/lib/ и не нужно устанавливать DYLD_LIBRARY_PATH.
Примечание: если вы используете DBD::Oracle, вам не нужен пакет Instant Client ODBC.
Ответа Кристофера Джонса мне было недостаточно (macOS Monterey 12.2, Apple M1 Pro). Установка остановилась с
./Oracle.h:37:10: fatal error: 'oci.h' file not found
Чтобы это исправить, потребовалась установка Oracle SDK Package https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html#ic_osx_inst
Второй комментарий:
export DYLD_LIBRARY_PATH=$HOME/instantclient
не работает (см. Переменная Bash с именем, начинающимся с «DYLD», не загружается в среду: ошибка или функция?)
==================================================
Но это не конец проблемы. Установленный DBD::Oracle использовать нельзя. Это не удается:
Can't load '/Users/myname/.perlbrew/libs/perl-5.34.1@eien6/lib/perl5/darwin-2level/auto/DBD/Oracle/Oracle.bundle'
for module DBD::Oracle: dlopen(/Users/myname/.perlbrew/libs/perl-5.34.1@eien6/lib/perl5/darwin-2level/auto/DBD/Oracle/Oracle.bundle, 0x0001):
symbol not found in flat namespace '_OCIAttrGet' at
/Users/myname/perl5/perlbrew/perls/perl-5.34.1/lib/5.34.1/darwin-2level/DynaLoader.pm line 197.
Связано ли это с механизмом SIP MacOS? Как использовать DBD::Oracle?
Пожалуйста, не задавайте вопросы в ответ на другой вопрос. Лучше создать отдельный вопрос с подробным описанием вашей проблемы и ссылкой на другие вопросы, если они как-то связаны с вашей проблемой.
Это на самом деле не отвечает на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав Задать вопрос . Чтобы получать уведомления, когда на этот вопрос будут получены новые ответы, вы можете подписаться на этот вопрос . Как только у вас будет достаточно репутации , вы также можете добавить награду , чтобы привлечь больше внимания к этому вопросу. - Из отзыва
Если кто-то проголосовал за закрытие вопроса, пожалуйста, не могли бы вы написать комментарий с объяснением причины? (Что вы подразумеваете под
This question doesn’t meet a Stack Overflow guideline
?)