Подтвердить что ты не робот

Не удается найти библиотечную ошибку libcrypto

Когда я пытаюсь скомпилировать код C, который использует функции библиотеки openssl 'crypto' с кодовой линией -lcrypto с gcc 4.4.3, он дает ошибку

`@ubu:$ gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -lcrypto -o aes
 /usr/bin/ld: cannot find -lcrypto
 collect2: ld returned 1 exit status`

что может быть причиной этого?

Я уже прошел это обсуждение ld не может найти существующую библиотеку, но это не помогает.

найти результаты команды в

$ locate libcrypto
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.a
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.pc
/lib/libcrypto.so.0.9.8
/lib/i486/libcrypto.so.0.9.8
/lib/i586/libcrypto.so.0.9.8
/lib/i686/cmov/libcrypto.so.0.9.8
/usr/lib/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/local/ssl/lib/libcrypto.a
/usr/local/ssl/lib/pkgconfig/libcrypto.pc

Кто-нибудь может помочь в этом или указать на какую-либо ошибку, которую я делаю

@Daniel Roethlisberger попытался использовать флаг -L, но это привело к этим ошибкам

gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -L /usr/local/ssl/lib -lcrypto -o aes
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
dso_dlfcn.c:(.text+0x2d): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x43): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x4d): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr':
dso_dlfcn.c:(.text+0x8f): undefined reference to `dladdr'
dso_dlfcn.c:(.text+0xe9): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
dso_dlfcn.c:(.text+0x4b1): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x590): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var':
dso_dlfcn.c:(.text+0x611): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x6f0): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload':
dso_dlfcn.c:(.text+0x755): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load':
dso_dlfcn.c:(.text+0x837): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x8ae): undefined reference to `dlclose'
dso_dlfcn.c:(.text+0x8f5): undefined reference to `dlerror'
collect2: ld returned 1 exit status

Большое спасибо

4b9b3361

Ответ 1

Добавьте -L /usr/local/ssl/lib/ в командную строку GCC перед -lcrypto. Поскольку вы создаете против заголовков OpenSSL в разделе /usr/local/ssl, вам также необходимо связать фактическую библиотеку с тем же префиксом (хотя у вас только есть статический, установленный там, который может быть или не быть вашим намерением; может потребоваться правильно переустановить ваш OpenSSL, построенный из источника).

(edit) Чтобы исправить dlopen() и друзей, не найденных компоновщиком, добавьте -ldl в командную строку GCC. -ldl сообщает компоновщику также ссылку на libdl.so, которая является общей библиотекой, содержащей dlopen(), dlsym(), dlclose() и т.д.; эти функции используются OpenSSL внутренне и, следовательно, -ldl является косвенной зависимостью при использовании -lcrypto (в Linux). Поскольку вы ссылаетесь на статическую версию libcrypto, вам необходимо явно ссылаться на все косвенные зависимости.

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

Ответ 2

Это может быть актуально для людей, которые пытались создать свой собственный openssl из источника, а затем использовать его для компиляции других программ (в моем случае Git)

Во время настройки openssl добавьте параметр "shared", например: ./config shared

Это создаст необходимую статическую библиотеку libcrypto.so. Вы найдете больше в файле INSTALL;)

Кроме того, если вы столкнулись с этой ошибкой во время "make", ".... нельзя использовать при создании общего объекта, перекомпилировать с -fPIC"

Просто добавьте -fPIC в. /config, например.

./config shared -fPIC

Хотя я хотел бы, чтобы кто-то сказал мне, что он на самом деле делает, и что я ничего не напортачиваю.:)