Не удается найти библиотечную ошибку 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
Большое спасибо
Ответы
Ответ 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
Хотя я хотел бы, чтобы кто-то сказал мне, что он на самом деле делает, и что я ничего не напортачиваю.:)