Ошибка компиляции: / usr/bin/ld: не удается найти -lclntsh

#c #compilation #linker

#c #Сборник #компоновщик

Вопрос:

При попытке скомпилировать программу на C с помощью make file я сталкиваюсь со следующей ошибкой связывания, описанной ниже.

Я знаю, что такого рода проблемы уже обсуждались во многих других сообщениях, но я пробовал предлагаемые в них решения, но все они не сработали.

/usr/bin/ld: не удается найти -lclntsh

libclntsh.so и libclntsh.so.10.1 присутствуют в oracle path /u01/app/oracle/product/10.2.0/lib, и это задается как опция -L в файле make. Тем не менее я сталкиваюсь с проблемой:-

 Linking yieldrpt ...
cc -v -g -D_HPUX_SOURCE -DPARETO -Wl,-aarchive -L/u01/app/oracle/product/10.2.0/lib/         yieldrpt.o  -lclntsh `cat /u01/app/oracle/product/10.2.0/lib/ldflags`   -lmalloc -ldl -lm   
                -lmalloc -o yieldrpt
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c  ,objc,obj-c  ,java,fortran,ada --enable-java-awt=gtk --disable-dssi --disable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)
/usr/libexec/gcc/i386-redhat-linux/4.1.2/collect2 --eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 -o yieldrpt /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbegin.o -L/u01/app/oracle/product/10.2.0/lib/ -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.. -aarchive yieldrpt.o -lclntsh -lnbeq10 -lnhost10 -lnus10 -lnldap10 -lldapclnt10 -lnsslb10 -lntcp10 -lntcps10 -lnsslb10 -lntcp10 -lntns10 -lmalloc -ldl -lm -lmalloc -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i386-redhat-linux/4.1.2/crtend.o     /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o
/usr/bin/ld: cannot find -lclntsh
collect2: ld returned 1 exit status
make: *** [yieldrpt] Error 1
 

Пожалуйста, дайте мне знать, если потребуется какая-либо другая информация.
Спасибо

Комментарии:

1. может быть, проблема с 32-битной или 64-битной версией?

2. Пожалуйста ls -alg /u01/app/oracle/product/10.2.0/lib/*clntsh* .

3. /u01/приложение / oracle/продукт/10.2.0/ библиотека / clntsh.map /u01/приложение/ oracle/продукт/ 10.2.0/ библиотека/libclntsh.so -> libclntsh.so.10.1 /u01/приложение / oracle/продукт/ 10.2.0/ библиотека/libclntsh.so.10.1 .

4. @ ammoq: удивительно, что lib и lib32 указывают на одну и ту же папку в моей установке oracle для 10.2. Это действительно будет проблемой?

Ответ №1:

Вы переходите -aarchive к компоновщику. Это параметр совместимости HP / UX, который является синонимом -Bstatic , который предписывает компоновщику не связывать динамические библиотеки. Следовательно, ваш libclntsh.so игнорируется. Смотрите документацию

Если вы не знаете, почему существует эта опция, вы вполне можете удалить ее и повторить попытку. Если вы знаете, что это необходимо, то вам нужно будет найти статические библиотеки, в том числе libclntsh.a для создания ссылок.

Ответ №2:

Если у вас уже установлена libclntsh.so.12.1 или аналогичная, вы можете попробовать символическую ссылку библиотеки на libclntsh.so с помощью следующей команды: ln -s /usr/lib/oracle/12.1/client64/lib/libclntsh.so.12.1 /usr/lib/oracle/12.1/client64/lib/libclntsh.so

Ответ №3:

Для меня это было /usr/bin/ld: cannot find -lclntshcore . По какой-то причине следующая символическая ссылка отсутствует.

libclntshcore.so -> /home/ubuntu/ora2pg/instantclient_12_2/libclntshcore.so.12.1

Ответ №4:

 [oracle@em12c bin]$ pwd
/u01/em12c/middleware/oms/bin
[oracle@em12c bin]$ export ORACLE_HOME=/u01/em12c/middleware/oms
[oracle@em12c bin]$ ./genclntsh

[oracle@em12c bin]$ ls -l /u01/em12c/middleware/oms/lib32//libclntsh.so
lrwxrwxrwx. 1 oracle oinstall 17 Oct 23 22:16 /u01/em12c/middleware/oms/lib32//libclntsh.so -> libclntsh.so.11.1
 

Комментарии:

1. Хотя этот ответ довольно неинформативен, он показал мне, что моя проблема заключалась в том, что мой компилятор не находил libclntsh.so . Моя проблема заключалась в том, что мне нужна была программная ссылка для моего компилятора, чтобы найти вышеупомянутый файл. Как только я это сделал, это сработало ==> ln -s libclntsh.so.11.1 libclntsh.so .